平方偏转的阴影总是使一切都变成黑色



我最近试图更改我计算射线播放器中弥漫性照明的当前方式。它过去是这样计算的:

 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是一个衰减系数,然后对此线生成的每个反射射线衰减:

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;

light_falloff是一个恒定值:

#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_intsenty.set中作为除数的长度。它使最终的颜色值为一定值 ^ -5。但是,即使我用一个替换它(破坏了我的逼真的光衰减目标),我仍然会得到颜色值仍然接近零,因此是黑色图像。

我试图将另一个light_sources添加到对象附近,但是,要阴影的模型由具有不同坐标的多个多边形制成的事实,很难为它们确定一个好的选择。

所以我问。这对您来说似乎很正常,或者似乎是一个错误?对我而言,对我来说似乎并不奇怪,因为衰减是二次的。

似乎没有,有一些暗示,可以提示将光源放置在哪里,或者可以得到并非全部黑色的图像?

感谢您阅读所有这些!

p.s:强度被评论出来,因为在我以前做代码的示例中,这是一个

,因此您假设光的光度为" 1"?您的光多远?如果您的灯在10个单位之外,则它们的灯光为1/10或数量很少。这可能就是为什么您的图像是黑暗的原因。如果要执行此操作,则需要大量的光强度。在我的一个场景中,我有一个大约1000个单位(假装是太阳),强度为380000!另一件事...为了模拟现实,您应该使用1/长度^2。光强度随着距离的平方而掉落,而不仅仅是距离。祝你好运!

最新更新