我正在查看经典光线追踪器的渲染方程和源代码(因此没有 Monte Carlo 或尚未包含的任何内容),为了清楚起见,将其包含在下面的简短伪代码中。
我很难理解为什么渲染方程中的余弦不包含在光线追踪器实现中。我已经对我认为它丢失的地方发表了评论。
我可以看到,对于完美镜面反射的 BRDF (f_r = (δ(cosθi - cosθr)δ(φi - φr ± π)) / cosθi),余弦被抵消了。但是如果它与 phong 反射模型相结合,如下所示呢?
for (loop through pixels)
{
Ray ray(eye, getDirection(col+0.5,row+0.5));
vec3 color = trace(ray, 0);
}
trace(ray, recursion_depth)
{
if (too deep, or ray hits nothing)
return vec3(0,0,0); // return black
Hit hit(ray);
return vec3(hit.Ed) // light source color
+ classic_trace_lights(hit) // direct light
+ classic_trace_reflection(hit, depth) // specular reflection
+ classic_trace_refraction(hit, depth); // specular refraction
}
classic_trace_reflection(hit, depth)
{
....
vec3 R = ideal_reflected_direction(hit.vdir, hit.normal);
Ray ray(hit.pos, R);
return hit.Rs * classic_trace_recursive(ray, depth+1); // Rs = specular color
}
classic_trace_lights(...) { ... }
classic_trace_light(...)
{
....
return phong(...) * light.Ed /* * COSINE MISSING HERE? */;
}
....