现代GLSL中的每像素照明?

4
我希望你能提供一个适当的简单示例。
目前,我有一个基于教程的东西,但我没有看到三角形中间的变化。似乎每个三角形都会改变颜色,但只是整体上的改变。
out vec3 vertex_normal;         
out vec3 vertex_light_position; 

..在顶点着色器上。

使用

vertex_normal = normalize(NormalMatrix * in_Normal);

// old gl_NormalMatrix: "transpose of the inverse of the upper
// leftmost 3x3 of gl_ModelViewMatrix"

mat3 NormalMatrix = transpose(
                        inverse(
                            mat3(

                                ModelViewMatrix

                            )
                        )
                    );

关于片元着色器:

float diffuse_value = MAX(dot(vertex_normal, vertex_light_position), 0.0);

gl_FragColor =  out_Color * diffuse_value

但是,正如我所说的,每个三角形似乎都是一个实心颜色(只在整体上发生变化)。

我听说过归一化可能会起到作用,但如果我对vertex_normal进行normalize()操作,结果仍然相同。

1个回答

4
检查您的vertex_normalvertex_light_position的值。您可以通过让片段着色器执行以下操作来实现: gl_FragColor = vertex_normal 我不确定vertex_light_position是什么,但听起来应该是从顶点到光源的法线(normal),而不是光源的绝对位置。
编辑: 请参阅http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php

光源位置基于旧的gl_LightSource[0].position.xyz。我被告知这是一个静态光源位置。[在我参考的教程中就是这样使用的] - j riv
好的,如果 vertex_normalvertex_light_position 在每个像素点上都是常量,那么 diffuse_value 就会在每个像素点上都是常量,这样就实现了平面着色。 - Justicle
有道理。那么有什么变化吗?这是一个简单的教程,链接如下:http://www.swiftless.com/tutorials/glsl/5_lighting_perpixel.html - j riv
2
那个教程是错误的。VS 的第8行是错误的,这导致FS的第7行也是错误的。请查看我回答中添加的教程。缺少的是你需要计算每个像素的L,即从光源位置到插值顶点位置的法向量。 - Justicle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接