着色器属性mat4无法正确绑定(Opengl ES 2.0 Android)

时间:2012-12-15 23:38:31

标签: android opengl-es-2.0 glsl

我有以下着色器:

protected final static String vertexShaderCode =
    "attribute vec4 vPosition;" +
    "attribute vec2 texCoord;" +
    "attribute mat4 uMVPMatrix;   \n" +

    "varying vec2 vTexCoord;" +

    "void main() {" +
    "  gl_Position = uMVPMatrix * vPosition;" +
    "  vTexCoord = texCoord;" +
    "}";

我想将mvp矩阵作为属性传递,但它似乎没有正确绑定。我正在使用自动分配的绑定。当我在链接程序后查询属性位置时,如下所示:

// program linked previously
GLES20.glUseProgram(program);
GLES20.glEnable(GLES20.GL_TEXTURE_2D);

GLES20.glEnable(GLES20.GL_BLEND);
mPositionHandle = GLES20.glGetAttribLocation(program, "vPosition");
mTextureHandle = GLES20.glGetAttribLocation(program, "texCoord");
mtextureSampHandle = GLES20.glGetAttribLocation(program, "textureSamp");
mMVPMatrixHandle = GLES20.glGetAttribLocation(program, "uMVPMatrix");

返回的句柄是:

mTextureHandle:0

mMVPMatrixHandle:1

mPositionHandle:2

但是,从这里的文档:http://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindAttribLocation.xml,mMVPMatrixHandle应该被分配4个连续的句柄,一个用于矩阵的每一列(即mMVPMatrix应该有句柄1,2,3,4)。事实并非如此,我不知道为什么......

因此,我无法在屏幕上绘制任何内容。为了完整起见,我试图按如下方式加载矩阵:

    GLES20.glVertexAttribPointer(mMVPMatrixHandle2, 4, GLES20.GL_FLOAT, false, 0, t1);
    GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 1, 4, GLES20.GL_FLOAT, false, 0, t2);
    GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 2, 4, GLES20.GL_FLOAT, false, 0, t3);        
    GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 3, 4, GLES20.GL_FLOAT, false, 0, t4);

其中t1-t4是包含mvp矩阵的各行的缓冲区:

{
    1.74f, 0, 0, 0,
    0, 2.9f, 0, 0,
    0, 0, -2.414f, -1f,
    -2.088f, 0, -2.66f, 3
}

当我将uMVPMatrix定义为统一mat4并使用glUniformMatrix4fv加载时,它可以工作。

1 个答案:

答案 0 :(得分:1)

事实证明问题不是我的卡,而是电话。在三星Galaxy S2上试用时,属性已正确分配,并且按预期工作。

有问题的手机是HTC Incredible S,它有一块Adreno 205显卡。我想在手机/显卡上的Opengl实现一定存在问题。解决方案可以是在着色器中将矩阵定义为四个vec4并按元素计算位置。