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计算错误,但我无法弄清楚发生了什么问题。