【问题标题】:OpenGL ES 2.0 Point light shaderOpenGL ES 2.0 点光源着色器
【发布时间】:2012-10-31 19:39:12
【问题描述】:

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

我构建了自己的小型场景图,每个对象(目前只有框)都可以有自己的平移/旋转/缩放,并且渲染效果很好。每个盒子都分配了自己的模型视图和法线矩阵,它们都使用相同的投影矩阵。

对于每个对象,我将矩阵和灯光位置作为统一传递给着色器。

如果物体不旋转,灯光可以正常工作,但一旦物体旋转,灯光似乎会随着物体旋转,而不是停留在同一位置。

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

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 计算错误,但我不知道出了什么问题。

【问题讨论】:

    标签: ios opengl-es glkit


    【解决方案1】:

    我终于弄清楚出了什么问题。

    我不需要将 lightPosition 与 modelViewMatrix 相乘,而是将其与 viewMatrix 相乘,它只包含相机的变换,而不包含框的变换:

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

    现在可以正常使用了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多