GLSL点光转换

时间:2013-03-06 17:27:46

标签: java opengl glsl lwjgl

我在GLSL中写了一个基本的顶点着色器。这是源代码:

varying float intensity;
uniform vec4 lightPos;

void main() {
    intensity = 0.1;
    vec3 tfVert = (gl_ModelViewMatrix*gl_Vertex).xyz;
    vec3 tfNorm = normalize(gl_NormalMatrix*gl_Normal).xyz;
    vec3 tfLightPos = (gl_ModelViewMatrix*lightPos).xyz;

    vec3 lightDir = normalize(tfLightPos-tfVert).xyz;
    intensity += dot(lightDir, tfNorm);

    gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;
}

之后,片段着色器以不同强度浮动的亮度点亮片段。这是出了什么问题:我绘制了一些立方体,并将OBJ模型加载到世界中,或类似的东西。然后我使用glRotatef()和glTranslatef()并再次绘制相同的东西。 灯光在两个不同的位置出现两次(有点)。一旦处于翻译位置并且一次处于原始位置。转换后的模型仅受平移位置的光影响,原始模型仅受原始位置的光影响。另外,关键是我不使用gl_LightSource0 []来解决这个问题。有什么我做错了吗?有没有什么办法解决这一问题?我正在使用glTranslatef()和glRotatef()进行相机定位和旋转,如果这很重要的话。

2 个答案:

答案 0 :(得分:1)

不要通过gl_ModelViewMatrix转换lightPos

只需使用lightPos.xyz代替tfLightPos - 事实上你根本不需要tfLightPos

答案 1 :(得分:0)

可悲的是,如果不将更多信息传递给顶点着色器,则无法修复此问题。由于glTranslatef和glRotatef用于相机移动以及模型移动,因此着色器无法区分两者而不将转换和旋转传递给vec3中的GLSL。