【问题标题】:OpenGL Projection matrix won't allow displaying anythingOpenGL投影矩阵不允许显示任何东西
【发布时间】:2010-05-19 23:51:06
【问题描述】:

根据一些示例,我正在尝试让一些带有着色器的基本 OpenGL-ES 在 iPhone 上运行。

由于某种原因,我的投影矩阵拒绝在屏幕上显示某些内容。感觉就像一个剪裁平面设置得很近,但这与我提供的值相矛盾。如果我使用正交投影矩阵渲染相同的场景,我会看到我的对象显然没有透视。

下面是生成投影矩阵的代码:

esPerspective(&proj, 45.f, 768.0/1024.0, 1.f, 10000.f);

void esPerspective(ESMatrix *result, float fovy, float aspect, float nearZ, float farZ)
{
   float frustumW, frustumH;

   frustumH = tanf( fovy / 360.0f * PI ) * nearZ;
   frustumW = frustumH * aspect;

   esFrustum( result, -frustumW, frustumW, -frustumH, frustumH, nearZ, farZ );
}

void esFrustum(ESMatrix *result, float left, float right, float bottom, float top, float nearZ, float farZ)
{
    float       deltaX = right - left;
    float       deltaY = top - bottom;
    float       deltaZ = farZ - nearZ;
    ESMatrix    frust;

    if ( (nearZ <= 0.0f) || (farZ <= 0.0f) ||
          (deltaX <= 0.0f) || (deltaY <= 0.0f) || (deltaZ <= 0.0f) )
         return;

    frust.m[0][0] = 2.0f * nearZ / deltaX;
    frust.m[0][1] = frust.m[0][2] = frust.m[0][3] = 0.0f;

    frust.m[1][1] = 2.0f * nearZ / deltaY;
    frust.m[1][0] = frust.m[1][2] = frust.m[1][3] = 0.0f;

    frust.m[2][0] = (right + left) / deltaX;
    frust.m[2][1] = (top + bottom) / deltaY;
    frust.m[2][2] = -(nearZ + farZ) / deltaZ;
    frust.m[2][3] = -1.0f;

    frust.m[3][2] = -2.0f * nearZ * farZ / deltaZ;
    frust.m[3][0] = frust.m[3][1] = frust.m[3][3] = 0.0f;

    esMatrixMultiply(result, &frust, result);
}

我的投影矩阵如下:

[3.21, 0, 0, 0]
[0, 2.41, 0, 0]
[0, 0, -1, -1]
[0, 0, -2, 0]

即使我手动将 [3][3] 单元格设置为 1,我仍然看不到任何内容。

有什么想法吗?

【问题讨论】:

    标签: iphone opengl-es


    【解决方案1】:

    交换行和列(即转置)。

    您的投影矩阵以任何一种方式转置。你有一个行主投影矩阵...

    【讨论】:

    • 试图转置投影矩阵,后来得到模型-视图-投影矩阵,但仍然没有。
    猜你喜欢
    • 2017-10-13
    • 2019-08-10
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2015-04-11
    • 2015-11-01
    相关资源
    最近更新 更多