3

此顶点着色器代码适用于除Galaxy Note 2之外的所有设备。 gl_Position = uMVPMatrix * vPosition; 如果我将矩阵乘法反转为: gl_Position = vPosition * uMVPMatrix;我实际上可以让事情出现。

不幸的是,反过来需要我完全重写我的转换库。

有没有人知道可能导致这种情况的原因,这是设备的opengl驱动程序错误吗?

着色器代码

private final String vertexShaderCode =
    // This matrix member variable provides a hook to manipulate
    // the coordinates of the objects that use this vertex shader
    "uniform mat4 uMVPMatrix;" +

    "attribute vec4 vPosition;" +
    "attribute vec2 a_TexCoordinate;" +
    "varying vec2 v_TexCoordinate;" +
    "void main() {" +
    // the matrix must be included as a modifier of gl_Position
    "v_TexCoordinate = a_TexCoordinate;" +
    "gl_Position = uMVPMatrix * vPosition;" +
    "}";

private final String fragmentShaderCode =
    "precision mediump float;" +
    "uniform sampler2D u_Texture;" +
    "varying vec2 v_TexCoordinate;" +
    "void main() {" +
    "  gl_FragColor = texture2D(u_Texture, v_TexCoordinate);" +
    //"  gl_FragColor = vec4(v_TexCoordinate, 0, 1);" +
    "}";
4

1 回答 1

0

这不仅仅是关于 Galaxy Note 2 平台。

这是一道数学题。因为 glsl/hlsl 都使用列主顺序,

将 MATRIX x VECTOR 相乘是正确的方法

或者

您可以使用选项转置矩阵

glUniformMatrix4fv( h_Uniforms[UNIFORMS_PROJECTION], 1, GL_FALSE 或 GL_TRUE , g_proxtrans.s);

显然,不使用选项(GL_TRUE 是使用转置)调用此函数可能是个问题,每帧只是尝试。

于 2014-02-19T23:01:21.977 回答