C++ 从cpu代码到gpu着色器获取正确的漫反射材质
我试图在一个周末内从光线跟踪中取消此函数C++ 从cpu代码到gpu着色器获取正确的漫反射材质,c++,recursion,glsl,tail-recursion,raytracing,C++,Recursion,Glsl,Tail Recursion,Raytracing,我试图在一个周末内从光线跟踪中取消此函数 vec3颜色(常量光线&r,可打*世界) { 点击记录记录; 如果(世界->命中(r,0.0,MAXFLOAT,rec)){ vec3目标=rec.p+rec.normal+random_in_unit_sphere(); 返回0.5*颜色(光线(rec.p,target-rec.p),世界); } 否则{ vec3单位方向=单位向量(r.方向()); 浮动t=0.5*(单位为y()+1.0); 收益率(1.0-t)*vec3(1.0,1.0,1.0)+
vec3颜色(常量光线&r,可打*世界)
{
点击记录记录;
如果(世界->命中(r,0.0,MAXFLOAT,rec)){
vec3目标=rec.p+rec.normal+random_in_unit_sphere();
返回0.5*颜色(光线(rec.p,target-rec.p),世界);
}
否则{
vec3单位方向=单位向量(r.方向());
浮动t=0.5*(单位为y()+1.0);
收益率(1.0-t)*vec3(1.0,1.0,1.0)+t*vec3(0.5,0.7,1.0);
}
}
我知道它会发射光线并反弹,直到它不击中任何东西。因此,我尝试在GLSL着色器中取消此递归函数
vec3颜色(光线r,可点击列表)
{
hitRecord rec;
vec3单位方向;
浮动t;
while(命中(r,0.0,最大飞行高度,记录,列表))
{
vec3目标=rec.p+rec.normal;
r=射线(rec.p,target-rec.p);
}
单位方向=标准化(方向(r));
t=0.5*(单位方向y+1);
返回值(1.-t)*vec3(1.)+t*vec3(0.5,0.7,1.);
}
通常,它应该输出如下漫反射:但我只能得到这样的反光材料:
注意,材质具有高反射性,可以反射场景中的其他球体。
我看了一下代码,有人告诉我这是我的错误方法,我没有返回
0.5*
0.5*颜色(…)我不知道怎么做。
更新 由于Jarod42的awnser,现在实现了
0.5*
因子,这解决了材料未“正确”暴露在光线下的问题。
但是现在漫反射材质仍然没有生成,我最终得到了一种完全反射的金属材质。
要使用系数
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.));
}
target-rec.p
可以简化为rec.normal/*+random\u in\u unit\u sphere()*/
。顺便说一句,随机部分未被翻译。