gpt4 book ai didi

c++ - 从 cpu 代码到 gpu 着色器获取漫反射 Material

转载 作者:行者123 更新时间:2023-11-28 04:09:32 26 4
gpt4 key购买 nike

我正尝试在一个周末内从光线追踪中解开这个函数

vec3 color(const ray& r, hitable *world)
{
hit_record rec;
if(world->hit(r,0.0, MAXFLOAT, rec)){
vec3 target = rec.p + rec.normal + random_in_unit_sphere();
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);
}
}

我知道它会发出射线并反弹它直到它没有击中任何东西。
所以我试图在 GLSL 着色器中解开这个递归函数。

vec3 color(ray r, hitableList list)
{
hitRecord rec;
vec3 unitDirection;
float t;
while(hit(r, 0.0, FLT_MAX, rec, list))
{
vec3 target = rec.p + rec.normal;
r = ray(rec.p, target-rec.p);
}
unitDirection = normalize(direction(r));
t = 0.5* (unitDirection.y + 1.);
return (1.-t)*vec3(1.)+t*vec3(0.5,0.7,1.);
}

通常它应该输出这样的漫反射:
Actual diffuse material on cpu

但我只得到这样的反光 Material :
Attempt one of the GPU diffuse material

请注意,该 Material 具有高反光性,可以反射场景中的其他球体。
我查看了代码,有些东西告诉我这是我对这个 tail recursive function 的错误处理。
而且我没有返回 0.5 * return 0.5 * color(...) 我不知道该怎么做。

更新

多亏了 Jarod42 的 awnser,现在实现了 0.5 * 因子,这解决了 Material 未“正确”暴露在光线下的问题。
但是现在漫反射 Material 还没有生成,我最终得到了一个全反射的金属 Material 。
Attempt two of the diffuse material

最佳答案

要使用 0.5 的因子,您可以这样做:

vec3 color(ray r, hitableList list)
{
hitRecord rec;
vec3 unitDirection;
float t;
float factor = 1.f;

while(hit(r, 0.0, FLT_MAX, rec, list))
{
vec3 target = rec.p + rec.normal;
r = ray(rec.p, target-rec.p);
factor *= 0.5f;
}
unitDirection = normalize(direction(r));
t = 0.5* (unitDirection.y + 1.);
return factor * ((1.-t)*vec3(1.)+t*vec3(0.5,0.7,1.));
}

关于c++ - 从 cpu 代码到 gpu 着色器获取漫反射 Material ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58120011/

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