我在c ++中使用gles2.0绘制一个简单的四边形。如果我使用基本顶点着色器绘制它没有问题,这就是结果
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);
答案 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方向上转换几何体,以便将它放置在您正在使用的投影变换的近平面和远平面之间。