C++;射线追踪虫 我在C++中编写了一个光线跟踪程序。这是用于计算漫反射组件的代码段: //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; } } //漫反射组件 颜色漫反射(0,0,0); 如果(内部材料扩散度>0) { 用于(自动和灯光:灯光) { //定义从命中对象到灯光的光线 光线光线方向(intrs.point,(light->point-intrs.point).normalize()); double nl=灯光方向*intrs.normal;//点积 双递减系数=1.0; 双距离=输入点SQR距离(灯光->点); //检查它是否到达灯光 如果(nl>0) { 对于(int i=0;i相交(灯光方向,形状[i]->插值法线)); if(温度输入有效和温度输入点SQRDInstance(输入点)灯光颜色*灯光->灯光强度*nl*减小系数; } }

C++;射线追踪虫 我在C++中编写了一个光线跟踪程序。这是用于计算漫反射组件的代码段: //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; } } //漫反射组件 颜色漫反射(0,0,0); 如果(内部材料扩散度>0) { 用于(自动和灯光:灯光) { //定义从命中对象到灯光的光线 光线光线方向(intrs.point,(light->point-intrs.point).normalize()); double nl=灯光方向*intrs.normal;//点积 双递减系数=1.0; 双距离=输入点SQR距离(灯光->点); //检查它是否到达灯光 如果(nl>0) { 对于(int i=0;i相交(灯光方向,形状[i]->插值法线)); if(温度输入有效和温度输入点SQRDInstance(输入点)灯光颜色*灯光->灯光强度*nl*减小系数; } },c++,graphics,raytracing,C++,Graphics,Raytracing,当然,我不能发布完整的代码,但我想应该清楚我在这里做的是什么-intrs是光线和对象的当前交点,shapes是场景中所有对象的向量 颜色表示为(0,1)范围内的RGB。颜色的加法和乘法是简单的成员加法和乘法。只有当光线跟踪结束,并且我想写入图像文件时,我才将我的颜色乘以255,如果组件大于255,则钳制为255 当前,场景中有一个点光源,它是白色的:颜色(1,1,1),强度=1.0 这是我的渲染图像: 所以,这不是对的——左边的橱柜应该是绿色的,盒子应该是红色的 我的实现是否有明显的问题?我似

当然,我不能发布完整的代码,但我想应该清楚我在这里做的是什么-
intrs
是光线和对象的当前交点,
shapes
是场景中所有对象的向量

颜色表示为(0,1)范围内的RGB。颜色的加法和乘法是简单的成员加法和乘法。只有当光线跟踪结束,并且我想写入图像文件时,我才将我的颜色乘以255,如果组件大于255,则钳制为255

当前,场景中有一个点光源,它是白色的:颜色(1,1,1),强度=1.0

这是我的渲染图像:

所以,这不是对的——左边的橱柜应该是绿色的,盒子应该是红色的


我的实现是否有明显的问题?我似乎不明白。如果有必要,我会发布更多的代码

您的
diffuse+=
行似乎应该位于
if(nl>0)
条件的内部,而不是外部。

我发现了问题。由于某种原因,我的
intrs.normal
向量没有标准化。谢谢大家的帮助

我可能会说错什么,是不是应该是点积?@rak007是点积。:)在我的问题中,我会注意到这一点。同样,你能补充一些关于
color
类如何实现
+=
重载的解释吗。场景中有多少灯光?2.所有因素都在
漫反射+=
表达式
@Eutherpy中,请将其纳入问题,这是至关重要的信息。