将4x4矩阵传递到着色器cocos2d-x

时间:2016-09-15 08:17:00

标签: c++ opengl matrix shader cocos2d-x

我正在尝试将自己的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时理解所有选项。

0 个答案:

没有答案