Graphics 带有平方衰减的着色始终使所有内容都变黑

Graphics 带有平方衰减的着色始终使所有内容都变黑,graphics,3d,raytracing,lighting,shading,Graphics,3d,Raytracing,Lighting,Shading,我最近尝试更改在光线跟踪器中计算漫反射照明的当前方式。过去是这样计算的: float lambert = (light_ray_dir * normal) * coef; red += lambert * current.color.red * mat.kd.red; green += lambert * current.color.green * mat.kd.green; blue += lambert * current.color.blue * mat.kd.blue; 其中,c

我最近尝试更改在光线跟踪器中计算漫反射照明的当前方式。过去是这样计算的:

 float lambert = (light_ray_dir * normal) * coef;
 red += lambert * current.color.red * mat.kd.red;
 green += lambert * current.color.green * mat.kd.green;
blue += lambert * current.color.blue * mat.kd.blue;
其中,coef是一个衰减系数,每个像素从1开始,然后对该线生成的每个反射光线进行衰减:

coef *= mat.reflection;
这很有效

但我决定尝试更现实的方法,并实现了以下目标:

float squared_attenuation = LIGHT_FALLOFF * lenght;
light_intensity.setX ((current.color.red /*INTENSITY*/)/ squared_attenuation);
light_intensity.setY ((current.color.green  /*INTENSITY*/)/ squared_attenuation);
light_intensity.setZ ((current.color.blue  /*INTENSITY*/)/ squared_attenuation);
red   += ALBEDO * light_intensity.getX() * lambert * mat.kd.red;
green += ALBEDO * light_intensity.getY() * lambert * mat.kd.green;
blue  += ALBEDO * light_intensity.getZ() * lambert * mat.kd.blue;
当灯光衰减时,它是一个常量值:

#define LIGHT_FALLOFF M_PI * 4
长度是从点光源中心到交点的向量长度:

inline float normalize_return_lenght ()  {
     float lenght = sqrtf (x*x + y*y + z*z);
     float inv_length = 1/lenght;
     x = x * inv_length, y = y * inv_length, z = z * inv_length;
     return lenght;
  }

float lenght = light_ray_dir.normalize_return_lenght ();
问题是,所有这些只会产生一个黑屏!罪魁祸首是在light_intensity.set中作为除数的长度。它使最终颜色值为某个值^-5。然而,即使我将其替换为1(破坏了我的真实光衰减目标),我仍然会得到接近零的颜色值,从而得到黑色图像

我试图添加另一个更靠近对象的光源,但是,需要着色的模型是由多个具有不同坐标的多边形组成的,因此很难确定它们的正确位置

所以我问。这对你来说是正常的,还是一个bug?对我来说,这个理论对我来说并不奇怪,因为衰减是二次的

似乎没有,有一些关于光源放置位置的提示,或者任何可以得到不全黑图像的东西

谢谢你阅读这一切


注:强度被注释掉了,因为在我用来编写代码的例子中,它是一个

所以你假设光的光度为“1”? 你的光有多远? 如果你的光是-比如-10个单位,那么它们对光的贡献将是1/10,或者是一个非常小的数字。这可能就是为什么你的图像是黑色的。 如果你要这样做的话,你需要有相当大的光强度数值。在我的一个场景中,我有一个大约1000单位远的灯光(假装是太阳),强度是380000!! 还有一件事要模拟现实,应使用1/length^2。光强度随着距离的平方而下降,而不仅仅是距离。
祝你好运

附言:我们能够在一个测试用例中得到一些看起来不接近0的值,但是图像仍然是黑色的。其中一些值:colors:0.0675737 0.102384,colors:0.161311 0.244411考虑得更好,将其与有效的旧计算进行比较,它们显然太小,除了黑色之外,无法产生任何东西。