Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从cpu代码到gpu着色器获取正确的漫反射材质_C++_Recursion_Glsl_Tail Recursion_Raytracing - Fatal编程技术网

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()*/
。顺便说一句,随机部分未被翻译。