2016-06-20 30 views
0

我想渲染到立方體貼圖。正在渲染的場景是一個地形。 我使用緯度經度調試顯示來查看某個立方體貼圖中的內容。 左下角的兩個調試視圖是虛擬立方體貼圖,只顯示實際圖片的方向和一個立方體貼圖。OpenGL渲染到立方圖

右下半部分的調試視圖顯示了我在之後的立方體貼圖中呈現的內容。

我已經嘗試了很多不同的組合設置相機,但沒有一個給出了任何邏輯結果。我還將代碼與多個示例的代碼進行了比較,以實現動態立方體貼圖,但仍無法發現問題。我不知道接下來會嘗試什麼,所以我們歡迎任何幫助或建議。

繪製到立方體貼圖功能:

void Draw(GLuint cubemap, glm::ivec2 res, glm::vec3 position) 
{ 

    glBindFramebuffer(GL_FRAMEBUFFER, fbo); 

    glBindRenderbuffer(GL_RENDERBUFFER, rb); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, res.x, res.y); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rb); 

    // camera 
    glm::mat4 p = glm::perspective(90.0f, 1.0f, 0.01f, 10.0f); 
    glm::mat4 v; 

    glm::vec3 targets[6] = { 
     glm::vec3(+1.0f, 0.0f, 0.0f), 
     glm::vec3(-1.0f, 0.0f, 0.0f), 
     glm::vec3(0.0f, +1.0f, 0.0f), 
     glm::vec3(0.0f, -1.0f, 0.0f), 
     glm::vec3(0.0f, 0.0f, +1.0f), 
     glm::vec3(0.0f, 0.0f, -1.0f) 
    }; 
    glm::vec3 ups[6] = { 
     glm::vec3(0.0f, 1.0f, 0.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f), 
     glm::vec3(0.0f, 0.0f, 1.0f), 
     glm::vec3(0.0f, 0.0f, -1.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f) 
    }; 

    // render 
    for (int i = 0; i < 6; i++) 
    { 
     glViewport(0, 0, res.x, res.y); 
     // setup target face 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, cubemap, 0); 
     // setup camera 
     v = glm::lookAt(position, position + targets[i], ups[i]); 
     // draw 
     DrawTerrain(terrain.heightmap, terrain.m, v, p); // model, view, projection matrices 
    } 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

screenshot

回答

0

矩陣是錯誤的。對數值進行非常徹底的檢查後,glm返回的值對於投影矩陣和視圖矩陣都是不正確的。我會看看我是否會報告bugfix的請求,但現在,這裏是實際修復矩陣的代碼。

// projection matrix (fov = 90 degrees, aspect = 1.0) 
glm::mat4 p; 
float n = 0.1f, f = 2.0f; // near and far 
p[0][0] = 1.0f; 
p[1][1] = 1.0f; 
p[2][2] = -f/(f - n); 
p[2][3] = -1.0f; 
p[3][2] = -(f*n)/(f - n); 

glm::vec3 targets[6] = { 
    glm::vec3(+1.0f, 0.0f, 0.0f), 
    glm::vec3(-1.0f, 0.0f, 0.0f), 
    glm::vec3(0.0f, +1.0f, 0.0f), 
    glm::vec3(0.0f, -1.0f, 0.0f), 
    glm::vec3(0.0f, 0.0f, +1.0f), 
    glm::vec3(0.0f, 0.0f, -1.0f) 
}; 
glm::vec3 ups[6] = { 
    glm::vec3(0.0f, 1.0f, 0.0f), 
    glm::vec3(0.0f, 1.0f, 0.0f), 
    glm::vec3(0.0f, 0.0f, -1.0f), 
    glm::vec3(0.0f, 0.0f, 1.0f), 
    glm::vec3(0.0f, 1.0f, 0.0f), 
    glm::vec3(0.0f, 1.0f, 0.0f) 
}; 
for(int i=0; i<6; ++i) 
{ 
    // view matrix 
    v = glm::lookAt(position, position + targets[i], ups[i]); 
    v[0][2] *= -1.0f; 
    v[1][2] *= -1.0f; 
    v[2][2] *= -1.0f; 
    v[3][2] *= -1.0f; 
    // render... 
} 

編輯:

後Andreas的意見,我研究多一點。

glm::perspective需要以弧度爲單位的FOV,但由於每個使用該功能的例子都用度來調用它,所以我從來沒有真正懷疑過它。在scrathapixel檢查後,我確信透視矩陣是正確的(即使該決定因素是否定的)。所以,FOV處於放射狀態,這是我的錯誤。

但是,lookAt是錯誤的。我將這個功能與幾種資源進行了比較,並且與bgfx's lookAt進行了比較,實際上,整個第三列的符號應該相反。因此,我將視圖矩陣的該列乘以-1的更改仍然存在。

+0

嗯,'glm'只是標題,所以你可以很容易地修復它而不是「請求修復」。 'perspective'幾乎就是'gluPerspective'的1:1副本,這是一個非常簡單的函數,所以我有點困惑如何可能有一個錯誤。 –

+0

看着'p [2] [2]'的值我懷疑你可能不知道z軸指向相機,而不是遠離它。 x軸向右,y軸向上,所以如果座標系應該是右手的,則z軸需要指向相機。然而,你的矩陣有一個負面的決定因素,這是錯誤的。 –

+0

@AndreasHaferburg我已經編輯了更多的答案。 –