着色器属性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)编程有所帮助,所以不幸的是指针不是问题所在。虽然我一直在使用自动绑定。今天晚些时候我会试试手册,看看是否有用。