gpt4 book ai didi

c++ - 漫反射 Material 奇怪的光线追踪行为

转载 作者:行者123 更新时间:2023-11-30 01:02:36 25 4
gpt4 key购买 nike

我一直在阅读和试用 Peter Shirley 的“一个周末的光线追踪”。在漫反射 Material 部分之前,一切都进行得很顺利。基本上,我的算法似乎只是从特定角度转换阴影,而不是漫反射 Material ,我不知道问题可能来自哪里。

我通常都是一步一步跟着书看的。前面几节给出了正确的结果,我从上一节添加到漫反射 Material 的唯一代码是下面的函数。

这里是漫反射 Material 代码的特定部分,它基本上将光线反射到一个随机方向,从与碰撞点相切的球体中选择(如果我的解释不够清楚,抱歉)。

这是从球体的切线到碰撞点随机取一个点的函数。

vec3 random_in_unitSphere(){
vec3 p;
std::default_random_engine generator;
std::uniform_real_distribution<float> distribution(0.0, 1.0);
do{
p = 2.0*vec3(distribution(generator),distribution(generator),distribution(generator)) - vec3(1,1,1);
}while (p.squared_length() >= 1.0);
return p;
}

这是计算像素颜色的函数(通过转换光线直到它什么都没碰到)

vec3 color(const Ray& r,Hitable *world){
hit_record rec;
if(world->hit(r,0.0,FLT_MAX,rec)){
vec3 target = rec.p + rec.normal + random_in_unitSphere();
return 0.5*color(Ray(rec.p,target-rec.p),world);
}
else{
vec3 unit_direction = unit_vector(r.direction());
float t = 0.5*(unit_direction.y() + 1.0);
return (1.0-t)*vec3(1.0,1.0,1.0) + t*vec3(0.5,0.7,1.0);
}
}

这是负责为图像的每个像素转换光线的循环。

for(int j = ny-1 ;  j >= 0 ; j--){
for(int i = 0; i < nx ; i++){
vec3 col(0,0,0);
for(int s = 0; s < ns ; s++){
float u = float(i+ distribution(generator)) / float(nx);
float v = float(j+ distribution(generator)) / float(ny);
Ray r = camera.getRay(u,v);
vec3 p = r.pointAt(2.0);
col += color(r,world);
}
col /= float(ns);
int ir = int (255.99*col.r());
int ig = int (255.99*col.g());
int ib = int (255.99*col.b());
outfile<< ir << " " << ig << " " << ib << std::endl;
}
}

这是预期的输出:https://imgur.com/im5HNEK

这是我得到的:https://imgur.com/heNjEVV

谢谢!

最佳答案

问题很简单,每次生成随机 vector 时,您都在使用新的默认初始化 伪随机数生成器。随机数生成器包含一些状态,需要保留此状态以便随着时间的推移看到不同的结果。

要解决此问题,只需以一种或另一种方式使您的随机数生成器保持静态即可:

vec3 random_in_unitSphere(){
vec3 p;
static std::default_random_engine generator{std::random_device{}()};
std::uniform_real_distribution<float> distribution(0.0, 1.0);
do{
p = 2.0*vec3(distribution(generator),distribution(generator),distribution(generator)) - vec3(1,1,1);
}while (p.squared_length() >= 1.0);
return p;
}

在这里,我还使用了 std::random_device 来(可能)向生成器添加一些真实世界的随机性。

关于c++ - 漫反射 Material 奇怪的光线追踪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55715166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com