2016-06-20 12 views
0

キューマップにレンダリングしようとしています。レンダリングされているシーンは地形です。 latitude-longitudeデバッグ表示を使用して、特定のキューブマップの内容を確認します。 左下の2つのデバッグビューは、方向を示すダミーキューブマップと実際のピクチャを持つ1つのキューマップです。キューブへの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が戻っていた値は、投影行列とビュー行列の両方にとって正しくありませんでした。バグ修正のリクエストを報告するかどうかがわかりますが、ここでは実際に行列を修正したコードを示します。

// 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... 
} 

編集:私はもう少し検討しアンドレアスコメントした後

glm::perspective必要なFOVはラジアンですが、その関数を使用したすべての例では次数で呼び出されているため、実際には疑わないことがありました。 scrathapixelでチェックした後、私は、(行列式が負であっても)透視行列が正しいことを確信しました。だから、FOVは放射状にあり、それは私の間違いだった。

ただし、lookAtは間違っていました。私はその機能をいくつかのリソースに渡って比較したが、確かにbgfx's lookAtと比較して、実際には3番目の列全体が反転しているはずである。ですから、ビューマトリックスのその列に-1を掛けた変更は残っていました。

+0

「glm」はヘッダーのみなので、「修正依頼」ではなく簡単に修正できます。 'perspective'は' gluPerspective'の1:1のコピーです。これは非常に単純な関数なので、どうやってバグになる可能性があるのか​​ちょっと難解です。 –

+0

'p [2] [2]'の値を見ると、z軸がカメラの方を向いていることを知らないかもしれないと思うかもしれません。 x軸が右に移動し、y軸が上がるので、座標系が右手であると想定される場合、z軸はカメラの方を向ける必要があります。しかし、あなたの行列には負の行列式がありますが、それは間違っています。 –

+0

@AndreasHaferburg私は答えをさらに編集しました。 –

関連する問題