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

着色器属性mat4未正确绑定(Opengl ES 2.0 Android),android,opengl-es-2.0,glsl,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 = uMVPMatr

我有以下着色器:

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");
    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);
返回的句柄是:

mTextureHandle:0

mMVPMatrixHandle:1

mPositionHandle:2

但是,根据此处的文档:,应为mMVPMatrixHandle分配4个连续句柄,矩阵的每列一个句柄(即mMVPMatrix应具有句柄1,2,3,4)。事实并非如此,我不知道为什么

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

// 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");
    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加载它时,它就起作用了。

结果表明问题不在于我的卡,而在于手机。当在三星Galaxy S2上试用时,属性被正确分配,并按预期工作


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

为什么要在属性中设置MVP矩阵和纹理采样器?你真的需要每个顶点的这些信息吗?请看MVP矩阵,这是一个2d游戏,我正在尝试批量绘制我的粒子效果。每个粒子精灵都有自己独特的位置/方向,因此有自己的MVP矩阵。将MVP矩阵连接到一个数组(每个顶点一个矩阵)虽然浪费,但应该比每个精灵的单个绘制调用快得多。我可以传递一个统一的MVP矩阵数组,但如果我的爆炸有太多的粒子,我担心GPU会在软件上模拟。实现看起来应该很简单,但我真的不确定为什么它不为矩阵绑定4个位置。绑定矩阵数据时,请尝试使用&matrixdata[0]而不是matrixdata。我曾经遇到过一个奇怪的场景,在这个场景中,这似乎对我用Java(Android)编程有所帮助,所以不幸的是指针不是问题所在。虽然我一直在使用自动绑定。今天晚些时候我会试试手册,看看是否有用。