带有MVP矩阵的Android Native GLES 2.0黑屏

时间:2016-10-14 18:17:56

标签: android c++ matrix opengl-es projection

我在c ++中使用gles2.0绘制一个简单的四边形。如果我使用基本顶点着色器绘制它没有问题,这就是结果

enter image description here

uniform mat4 u_mvp;
attribute vec4 a_Position;
void main(){
   gl_Position = a_Position;
}

如果我添加MVP矩阵

gl_Position = u_mvp * a_Position;

然后屏幕上什么也没有。

这是透视矩阵:

Matrix4 Matrix4::getPerspective(float angle, float ratio, float near, float far) {
    // angle = 45; ratio = 1.438; near = 1; far = 100
    Matrix4 matrix;

    float top = (float)(near * Math::tangentDegrees(angle / 2.0f));
    float bottom = -top;

    float right = top * ratio;
    float left = -right;

    matrix.m[0] = (2 * near) / (right - left);
    matrix.m[1] = 0.0f;
    matrix.m[2] = (right + left) / (right - left);
    matrix.m[3] = 0.0f;

    matrix.m[4] = 0.0f;
    matrix.m[5] = (2 * near) / (top - bottom);
    matrix.m[6] = (top + bottom) / (top - bottom);
    matrix.m[7] = 0.0f;

    matrix.m[8] = 0.0f;
    matrix.m[9] = 0.0f;
    matrix.m[10] = -(far + near) / (far - near);
    matrix.m[11] = -(2 * far * near) / (far - near);

    matrix.m[12] = 0.0f;
    matrix.m[13] = 0.0f;
    matrix.m[14] = -1.0f;
    matrix.m[15] = 0.0f;

    return matrix;
}

获得modelView矩阵如下:

modelView = translation * rotation * scale
mvp = perspective * modelView

按照此示例获取此乘法的每个元素  http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/ 并且所有这些都在身份矩阵中被初始化。

使用此命令获取句柄

transformUniformHandle = (GLuint)glGetUniformLocation(getProgramId(), "u_mvp");

使用此命令我在着色器中设置mvp矩阵(尝试了GL_FALSE,GL_TRUE)

glUniformMatrix4fv(transformUniformHandle, 1, GL_TRUE, modelViewProjection.m);

2 个答案:

答案 0 :(得分:0)

鉴于你没有展示你的整个代码,我无法确定,但可能是你在调用glUniformMatrix4fv之前没有调用glUseProgram。也可能是您的三角形被投影矩阵剪掉了。确保点在剪切范围内。如果没有解决它,你应该从glGetError获得错误。此页面将解释其用途:OpenGL error checking

答案 1 :(得分:0)

OpenGL使用列主要存储作为矩阵,而投影矩阵则按行主要顺序设置。所以你需要转置矩阵元素的顺序:

matrix.m[0] = (2 * near) / (right - left);
matrix.m[4] = 0.0f;
matrix.m[8] = (right + left) / (right - left);
matrix.m[12] = 0.0f;

matrix.m[1] = 0.0f;
matrix.m[5] = (2 * near) / (top - bottom);
matrix.m[9] = (top + bottom) / (top - bottom);
matrix.m[13] = 0.0f;

matrix.m[2] = 0.0f;
matrix.m[6] = 0.0f;
matrix.m[10] = -(far + near) / (far - near);
matrix.m[14] = -(2 * far * near) / (far - near);

matrix.m[3] = 0.0f;
matrix.m[7] = 0.0f;
matrix.m[11] = -1.0f;
matrix.m[15] = 0.0f;

您尝试通过在此处传递GL_TRUE作为第三个参数来转置矩阵:

glUniformMatrix4fv(transformUniformHandle, 1, GL_TRUE, modelViewProjection.m);

ES 2.0不支持此功能,唯一有效的参数值为GL_FALSE。在此之后致电GL_INVALID_VALUE时,您会看到glGetError()错误。如果您的OpenGL代码有任何问题,则应该例行调用glGetError()

如果你真的想要,你可以保持矩阵行主要,并通过乘以右边的向量来相应地改变着色器代码:

gl_Position = a_Position * u_mvp;

但是,对于矩阵使用列主要顺序可能更好。

此外,您没有显示模型视图矩阵。您必须确保视图转换在负z方向上转换几何体,以便将它放置在您正在使用的投影变换的近平面和远平面之间。