Opengl ES 2.0中的glFrustum变体 - 如何修复空白屏幕?

时间:2012-03-13 18:36:18

标签: c opengl-es opengl-es-2.0

好问题类似于我之前关于glOrtho变体的问题 glOrtho OpenGL es 2.0 variant how fix blank screen?

下面的三角形在正投影处完美绘制(没有投影它的压扁三角形,而不是矩形视口上的三个相等边三角形)

GLfloat triangle_vertices[] =
                 {
                -0.5, -0.25, 0.0,
                 0.5, -0.25, 0.0,
                 0.0, 0.559016994, 0.0
                 };

Ortho矩阵代码:

typedef float[16] matrix;

void ortho_matrix(float right, float left, float bottom, float top, float near, float far, matrix result)
  {
// First Column
    result[0] = 2.0 / (right - left);
    result[1] = 0.0;
    result[2] = 0.0;
    result[3] = 0.0;

// Second Column
    result[4] = 0.0;
    result[5] = 2.0 / (top - bottom);
    result[6] = 0.0;
    result[7] = 0.0;

// Third Column
   result[8] = 0.0;
   result[9] = 0.0;
   result[10] = -2.0 / (far - near);
   result[11] = 0.0;

// Fourth Column
    result[12] = -(right + left) / (right - left);
    result[13] = -(top + bottom) / (top - bottom);
    result[14] = -(far + near) / (far - near);
    result[15] = 1;
  }

将我的投影矩阵设置为ortho,其中aspect_ratio = screen_width / screen_heigth

  ortho_matrix(-aspect_ratio, aspect_ratio, -1.0, 1.0, -1.0, 1.0, PROJECTION_MATRIX);

任务是将正投影改为透视,所以我为此写了函数 UPD:更改为col-major

void frustum_matrix(float right, float left, float bottom, float top, float near, float far, matrix result)
{
        // First Column
    result[0] = 2 * near / (right - left);
    result[1] = 0.0;
    result[2] = 0.0;
    result[3] = 0.0;

    // Second Column
    result[4] = 0.0;
    result[5] = 2 * near / (top - bottom);
    result[6] = 0.0;
    result[7] = 0.0;

    // Third Column
    result[8] = (right + left) / (right - left);
    result[9] = (top + bottom) / (top - bottom);
    result[10] = -(far + near) / (far - near);
    result[11] = -1;

    // Fourth Column
    result[12] = 0.0;
    result[13] = 0.0;
    result[14] = -(2 * far * near) / (far - near);
    result[15] = 0.0;
 }

将我的投影设置为视锥体矩阵,其中aspect_ratio = screen_width / screen_heigth

  frustum_matrix(-aspect_ratio, aspect_ratio, -1.0, 1.0, 0.1, 1.0, PROJECTION_MATRIX);

我在glFrustrum页面http://www.opengl.org/sdk/docs/man/xhtml/glFrustum.xml查看矩阵,但是ortho func的矩阵来自同一个源并且工作正常。无论如何,我在https://stackoverflow.com/a/5812983/1039175视锥体函数等各个地方看到了类似的平截头体矩阵。

我得到的只是空白屏幕,视口和其他与绘图相关的东西设置正确。

2 个答案:

答案 0 :(得分:2)

我必须承认我懒得阅读你的代码,但是......假设你的清晰颜色设置为白色,可能是你没有设置视口:

确保在渲染之前至少调用一次:

GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
GLsizei width = viewport[2];
GLsizei height = viewport[3];
glViewport(0, 0, width, height);

至于一些一般建议:不要试图通过重写矩阵代码来重新发明轮子(除非出于某些学术目的)。如果你考虑切换到c ++,那么值得查看glm库:http://glm.g-truc.net/

它可以替代你正在尝试实现的那些矩阵函数,然后是一些...我自己使用它,它是一个很棒的数学库,因为它专门针对opengl-es 2.0和glsl。

答案 1 :(得分:2)

看起来您的矩阵索引是从glFrustum的doc页面转换而来的。在上传之前是否转置矩阵? OpenGL通常是指列向量矩阵,因此如果您从glFrustum复制方程式,索引应如下所示:

[0]  [4]  [ 8]  [12]
[1]  [5]  [ 9]  [13]
[2]  [6]  [10]  [14] 
[3]  [7]  [11]  [15]