2010-05-19 92 views
0

我想要獲得一些基於OpenGL-ES的着色器在iPhone上運行,基於一些示例。OpenGL投影矩陣將不允許顯示任何東西

由於某種原因,我的投影矩陣拒絕在屏幕上顯示某些東西。這感覺就像一個裁剪平面設置非常接近,但與我提供的價值觀相矛盾。如果我用正交投影矩陣渲染相同的場景,我會看到我的對象顯然沒有透視。

下面是生成投影矩陣的代碼:

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個I仍然沒有看到任何東西。

任何想法?

回答

0

交換你的行和列(即轉置)。

那麼你的投影矩陣是換位的方式。你有一個主要的投影矩陣...

+0

試圖轉置投影矩陣,後來產生的模型視圖投影矩陣,但仍然沒有。 – ohadpr 2010-05-20 15:19:33