我尝试实施点光源在OpenGL与GLSL。我把所有需要的数据的着色器。为了简单起见,我只在这里使用的漫反射光。

我的例子示出了欲与单个光源照亮一个巨大的三角形。光源被示出为小蓝色三角形。

有关漫射光我需要知道的光与该表面之间的夹角。因此,我计算法线和光的方向。然后,将点积给我一个数-1和1之间,而在0和1之间的所有内容被照亮。

然而,我在这里卡住,因为此角度是在我的示例不正确地计算。因为它是很难调试着色器,我用了几个输出,我表面的颜色。我用正常的色为三角形何光是,表面总是绿色。即,法线点上去的y轴,因此它们被计算权。也就是说,光的方向一定是错误的。但是,我找不到原因,这是错误的。光的位置和顶点”位置被传递在世界空间的顶点着色器,然后将其变换到眼的空间,计算光的方向,并通过这对片段着色器:

顶点着色器:

vec4 pos = modelview_matrix * <input vertex>;
vec4 lightPos = modelview_matrix * <light position>;

vec3 lightDir = normalize(lightPos.xyz - pos.xyz);

片段着色器:

float NdotL = max(dot(normalize(<correct normal>), normalize(lightDir)), 0.0);
gl_FragColor = vec4(1.0, NdotL, 0.0, 1.0);

我追加这个例子中的一些照片,这无疑表明,该插值是很奇怪的。我知道想知道我将代码粘贴是否正确,或者是否你需要知道更多的代码。此外,是该内插行为正常或者是它的一个错误在我的代码?

http://img41.imageshack.us/img41/3566/interpolation.png http://img189.imageshack.us/img189/3566/interpolation.png

尤其是第一图片显示的光的中心光点是不是的正下方的光,但稍微移动到三角形的中心。

如果我通过“POS”到片段着色器(即,它被内插),然后在片段着色器计算“lightDir”,一切工作正常。

有帮助吗?

解决方案

我认为,在顶点着色器的正常化影响lightDir结果插值载体时,因为它需要长度的方程,从而影响了插值的“速度”你。

如果你想有一个(视觉)的解释,尽量把它画在2D纸上。首先画一条线(三角形的)和点(光源)。添加两行(lightDir)为线的两端,以在光源和然后收缩(正常化)那些lightDir线以使它们具有相同的长度,并在光源既满足。如果连接标准化lightDir线的两端,你会得到一个非平行线(如果光源是不完全在你的第一行的中间)。 现在,如果你画一条线,去精确地通过其中一条线路的中间,你会看到,它不经过其他线路的中间,但会打它一下向左或向右移动。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top