【问题标题】:Opengl ES 2.0 ortho projection blank screenOpengl ES 2.0 正射投影黑屏
【发布时间】:2015-03-28 21:37:09
【问题描述】:

我对 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; }

【问题讨论】:

    标签: android opengl-es android-ndk opengl-es-2.0 orthographic


    【解决方案1】:

    您在对角元素的矩阵计算中缺少括号。它们应该是:

    projMat[0] = 2.0f / (right - left);
    projMat[5] = 2.0f / (top - bottom);
    projMat[10] = -2.0f / (far - near);
    

    【讨论】:

    • @Forzaferrarileo 你方格的坐标范围是多少?
    • -0.5f -0.5f 0.0f 0.5f -0.5f 0.0f -0.5f 0.5f 0.0f 0.5f 0.5f 0.0f
    • 看一些例子我看到他们也使用模型视图矩阵。我要使用它吗?
    • @Forzaferrarileo 使用这些坐标,您可能最多只能渲染一个像素。您选择了投影矩阵以使用 [0, width] x [0, height] 的坐标范围。如果要使用不同范围内的坐标,则必须相应地选择 leftrighttopbottom 值。很多时候,您会希望将模型视图矩阵与投影矩阵结合使用,但这并不是绝对必要的。在这种情况下,我认为您不需要它。
    • 我尝试使用50.0f而不是0.5f,但结果是一样的。我会尝试添加视图矩阵
    【解决方案2】:

    很难调试没有呈现任何内容的问题。你应该简化,直到你能找出问题所在。

    您已将 vPosition 声明为 vec4,但在您的评论中,您的顶点位置数组只有 12 个浮点数(每个顶点 3 个)。 vec4 每个顶点需要 4 个浮点数。这也是一个问题:

    glVertexAttribPointer(mvPositionHandle, 3, GL_FLOAT, GL_FALSE, 0, quadverts);
    

    您在上面一行中使用 3 作为第二个参数,但着色器中的 vec4 意味着在这里使用 4。确保 quadVerts 每个顶点有 4 个浮点数!

    要调试,不要使用投影矩阵 - 只需将几何图形直接渲染到着色器中的剪辑坐标,如下所示:

    attribute vec4 vPosition;
    uniform mat4 projMatrix;
    void main() {
        gl_Position = vPosition;
    };
    

    如果上面的着色器渲染(在你修复了你的 vec4 问题之后),那么你就可以开始调试你的投影矩阵了。

    你的 glClear() 调用真的生效了吗?尝试使用 glClearColor() 更改颜色并确保背景颜色相应更改。如果没有,您可能错误地设置了您的 GL 窗口。

    【讨论】:

      【解决方案3】:

      这个问题已经 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 1970-01-01
        • 1970-01-01
        • 2017-11-23
        • 1970-01-01
        相关资源
        最近更新 更多