2012-10-31 176 views
1

我目前正在尝试编写一个着色器,该着色器应该包含OpenGL ES 2.0中的一个简单的点光源,但它并不工作。OpenGL ES 2.0点光源着色器

我建立了自己的小型SceneGraph,每个对象(目前只有Boxes)可以有自己的翻译/旋转/缩放和渲染效果。每个方框都分配自己的模型视图和法线矩阵,并且它们都使用相同的投影矩阵。

对于每个对象,我将矩阵和光照位置作为制服传递给着色器。

如果对象不旋转,光线可以正常工作,但只要对象旋转,光线似乎与对象一起旋转,而不是停留在相同位置。

这是一些代码。 首先创建矩阵:

GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); 
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 0.0f); 

每个节点计算含有平移/旋转/标度的自己的变换矩阵,并与modelViewMatrix相乘:

modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, transformation); 

该矩阵被传递给着色器和对象已渲染后恢复旧矩阵。

正常矩阵计算如下:

GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); 

顶点着色器:

attribute vec4 Position; 
attribute vec2 TexCoordIn; 
attribute vec3 Normal; 

uniform mat4 modelViewProjectionMatrix; 
uniform mat4 modelViewMatrix; 
uniform mat3 normalMatrix; 

uniform vec3 lightPosition; 

varying vec2 TexCoordOut; 
varying vec3 n, PointToLight; 

void main(void) { 
    gl_Position = modelViewProjectionMatrix * Position; 
    n = normalMatrix * Normal; 

    PointToLight = ((modelViewMatrix * vec4(lightPosition,1.0)) - (modelViewMatrix * Position)).xyz; 

    // Pass texCoord 
    TexCoordOut = TexCoordIn; 
} 

片段着色器:

varying lowp vec2 TexCoordOut; 
varying highp vec3 n, PointToLight; 

uniform sampler2D Texture; 

void main(void) { 
    gl_FragColor = texture2D(Texture, TexCoordOut); 

    highp vec3 nn = normalize(n); 
    highp vec3 L = normalize(PointToLight); 

    lowp float NdotL = clamp(dot(n, L), -0.8, 1.0); 
    gl_FragColor *= (NdotL+1.)/2.; 
} 

我想PointToLight计算错误,但我无法弄清楚发生了什么问题。

回答

3

我终于明白出了什么问题。

相反,lightPosition与modelViewMatrix相乘的,我只需要与viewMatrix,其中只包含了相机的包装盒的转化,而不是转换来相乘:

PointToLight = ((viewMatrix * vec4(lightPosition,1.0)) - (viewMatrix * modelMatrix * Position)).xyz; 

现在它工作正常。

相关问题