我正在尝试将自己的mvp矩阵(浮点4x4)传递给顶点着色器,但我总是得到OpenGL错误0x0501,这意味着传递值与接收器变量不兼容。
这是顶点着色器的代码:
attribute vec4 a_color;
attribute vec4 a_posL;
attribute vec2 a_texCoord;
varying vec4 v_color;
varying vec2 v_texCoord;
uniform mat4 mvp_matrix;
void main()
{
gl_Position = mvp_matrix * a_posL;
v_color = a_color;
v_texCoord = a_texCoord;
}
这是我的自定义矩阵:
struct Matrix4f {
float m[4][4];
};
这是矩阵的初始化:
float x = 0.1f;
m_translateMatrix.m[0][0] = 1.0f; m_translateMatrix.m[0][1] = 0.0f; m_translateMatrix.m[0][2] = 0.0f; m_translateMatrix.m[0][3] = 0.0f;
m_translateMatrix.m[1][0] = 0.0f; m_translateMatrix.m[1][1] = 1.0f; m_translateMatrix.m[1][2] = 0.0f; m_translateMatrix.m[1][3] = 0.0f;
m_translateMatrix.m[2][0] = 0.0f; m_translateMatrix.m[2][1] = 0.0f; m_translateMatrix.m[2][2] = 1.0f; m_translateMatrix.m[2][3] = 0.0f;
m_translateMatrix.m[3][0] = 0.0f; m_translateMatrix.m[3][1] = 0.0f; m_translateMatrix.m[3][2] = 0.0f; m_translateMatrix.m[3][3] = 1.0f;
这就是我将全新矩阵传递给着色器的方式:
glUseProgram(m_shaderProgram->程序);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferId);
GLint posAttr = glGetAttribLocation(m_shaderProgram->program, "a_posL");
glEnableVertexAttribArray(posAttr);
glVertexAttribPointer(posAttr, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
GLuint mat_loc = glGetUniformLocation(m_shaderProgram->program, "mvp_matrix");
glUniformMatrix4fv(mat_loc, 1, GL_TRUE, &m_translateMatrix.m[0][0]);
glDrawElements(GL_TRIANGLES, (GLsizei)m_trianglesData.size(), GL_UNSIGNED_INT, m_trianglesData.data());
glBindBuffer(GL_ARRAY_BUFFER, 0);
CHECK_GL_ERROR_DEBUG();
我该怎么办?
P.S。:是的,我知道cocos2d-x已经拥有了我需要的所有矩阵,但我的主要目标是在没有任何cocos解决方案的情况下自己解决它的工作原理。我只使用cocos2d-x,因为它已经有了我可以绘制的opengl窗口,而且我知道在使用该引擎的OpenGL时理解所有选项。