【发布时间】:2018-06-21 07:34:01
【问题描述】:
我用 C++ 编写了一个光线追踪器。这是计算漫反射分量的sn-p:
//diffuse component
color diffuse(0, 0, 0);
if (intrs.mat.diffuseness > 0)
{
for (auto &light : lights)
{
//define ray from hit object to light
ray light_dir(intrs.point, (light->point - intrs.point).normalize());
double nl = light_dir.direction*intrs.normal; //dot product
double diminish_coeff = 1.0;
double dist = intrs.point.sqrDistance(light->point);
//check whether it reaches the light
if (nl > 0)
{
for (int i = 0; i < (int)shapes.size(); ++i)
{
shape::intersection temp_intrs(shapes[i]->intersect(light_dir, shapes[i]->interpolate_normals));
if (temp_intrs.valid && temp_intrs.point.sqrDistance(intrs.point) < dist)
{
diminish_coeff *= shadow_darkness;
break;
}
}
}
diffuse += intrs.mat.diffuseness * intrs.mat.col * light->light_color * light->light_intensity * nl*diminish_coeff;
}
}
当然,我不能发布整个代码,但我认为应该清楚我在这里做什么——intrs 是射线和物体的当前交集,shapes 是所有的向量场景中的物体。
颜色表示为 (0,1) 范围内的 RGB。颜色的加法和乘法是简单的成员加法和乘法。仅当光线跟踪结束并且我想写入图像文件时,我将颜色乘以 255,如果组件大于该值,则将其钳制为 255。
目前,场景中有一个点光源,它是白色的:color(1,1,1),intensity = 1.0。
所以,这是不对的——左边的橱柜应该是绿色的,而盒子应该是红色的。
我的实现是否有明显问题?我似乎无法弄清楚。如有必要,我会发布更多代码。
【问题讨论】:
-
我可能说错了,
nl不应该是点积吗? -
@rak007 是点积。 :) 我会在我的问题中指出这一点。
-
在同一张纸条上,您能否添加更多关于您的
colorclass 如何实现+=重载的说明? -
1.场景中有多少盏灯? 2.
diffuse +=表达式中的所有因子都是<= 1.? -
@Eutherpy 请edit 进入问题,这是至关重要的信息。
标签: c++ graphics raytracing