我对opengl很陌生,而且我试图用带有正交投影的opengl es 2.0显示一个正方形(在android上使用c ++和ndk),但我得到的只是一个空白屏幕。
如果我不使用投影矩阵,我可以得到正方形,但它会根据表面的纵横比进行拉伸。
我使用以下代码构建矩阵(参考https://www.opengl.org/sdk/docs/man2/xhtml/glOrtho.xml):
GLfloat projMat[16];
void ortho(float left, float right, float top, float bottom, float near, float far){
float tx = ((right+left)/(right-left))*-1;
float ty = ((top+bottom)/(top-bottom))*-1;
float tz = ((far+near)/(far-near))*-1;
projMat[0] = 2/right-left;
projMat[1] = 0.0f;
projMat[2] = 0.0f;
projMat[3] = 0.0f;
projMat[4] = 0.0f;
projMat[5] = 2/top-bottom;
projMat[6] = 0.0f;
projMat[7] = 0.0f;
projMat[8] = 0.0f;
projMat[9] = 0.0f;
projMat[10] = -2/far-near;
projMat[11] = 0.0f;
projMat[12] = tx;
projMat[13] = ty;
projMat[14] = tz;
projMat[15] = 1.0f; }
我将此函数称为:ortho(0.0,width,0.0, height,-1.0,1.0);
,其中宽度和高度是表面的宽度和高度。
我的顶点着色器:
attribute vec4 vPosition;
uniform mat4 projMatrix;
void main() {
gl_Position = projMatrix * vPosition;
};
我的片段着色器:
precision mediump float;
void main() {
gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}
我的绘画功能:
// 3D drawing
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(mProgram);
glUniformMatrix4fv(mPerspectivehandler, 1, GL_FALSE, projMat);
glEnableVertexAttribArray(mvPositionHandle);
glVertexAttribPointer(mvPositionHandle, 3, GL_FLOAT, GL_FALSE, 0, quadverts);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableVertexAttribArray(mvPositionHandle);
你知道哪里出错了吗?
修改: 我按照建议添加了括号,但它仍然无法正常工作
GLfloat projMat[16];
void ortho(float left, float right, float top, float bottom, float near, float far){
float tx = ((right+left)/(right-left))*-1;
float ty = ((top+bottom)/(top-bottom))*-1;
float tz = ((far+near)/(far-near))*-1;
projMat[0] = 2/(right-left);
projMat[1] = 0.0f;
projMat[2] = 0.0f;
projMat[3] = 0.0f;
projMat[4] = 0.0f;
projMat[5] = 2/(top-bottom);
projMat[6] = 0.0f;
projMat[7] = 0.0f;
projMat[8] = 0.0f;
projMat[9] = 0.0f;
projMat[10] = -2/(far-near);
projMat[11] = 0.0f;
projMat[12] = tx;
projMat[13] = ty;
projMat[14] = tz;
projMat[15] = 1.0f; }
答案 0 :(得分:2)
您在对角元素的矩阵计算中缺少括号。他们应该是:
projMat[0] = 2.0f / (right - left);
projMat[5] = 2.0f / (top - bottom);
projMat[10] = -2.0f / (far - near);
答案 1 :(得分:0)
调试没有渲染的问题可能很难。你应该简化,直到你能找出出错的地方。
您已将vPosition声明为vec4,但在您的注释中,您的顶点位置数组只有12个浮点数(每个顶点3个)。 vec4每个顶点需要4个浮点数。这也是一个问题:
attribute vec4 vPosition;
uniform mat4 projMatrix;
void main() {
gl_Position = vPosition;
};
您在上面的行中使用3作为第二个参数,但着色器中的vec4表示在此处使用4。确保quadVerts每个顶点有4个浮点数!
要进行调试,请不要使用投影矩阵 - 只需将几何体直接渲染到着色器中的剪辑坐标,如下所示:
yes
如果上面的着色器渲染(在修复vec4问题之后),则可以开始调试投影矩阵。
你的glClear()调用是否真的生效了?尝试使用glClearColor()更改颜色,并确保背景颜色相应更改。如果没有,您可能错误地设置了GL窗口。
答案 2 :(得分:0)
这个问题是4个月大,我不知道你是否还需要一个下水道。 我在OpenGL中使用orto投影矩阵也遇到了很多问题,但这对我来说很有用:
result[0] = 2.0 / (right - left);
result[1] = 0.0;
result[2] = 0.0;
result[3] = 0.0;
result[4] = 0.0;
result[5] = 2.0 / (top - bottom);
result[6] = 0.0;
result[7] = 0.0;
result[8] = 0.0;
result[9] = 0.0;
result[10] = (1.0f / (near - far));
result[11] = 0.0;
result[12] = ((left + right) / (left - right));
result[13] = ((top + bottom) / (bottom - top));
result[14] = (near / (near - far));
result[15] = 1;