2011-09-11 7 views
2

私はOpenGLを初めて使っていて、スカイボックスのレンダリングに問題が発生しました。 この図は、この問題をかなりうまく示しています。OpenGL Skyboxが正しくレンダリングされない側

skyboxの辺が表示されず、画像のように辺を表示すると、 の別の辺ではなく、画像が右隣にレンダリングされているように見えますキューブ。

void display (void) // Create The Display Function 
{ 
glPushMatrix(); 
glDepthMask(0); 
/* replace this code with your height field implementation */ 
/* you may also want to precede it with your rotation/translation/scaling */ 
/* Clear buffers */ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
gluLookAt(0.0, 0.0, 0.0, // eye position 
      0.1, 0.0, 0.1, // camera direction 
      0.0, 1.0, 0.0); // up direction 

glPushAttrib(GL_ENABLE_BIT); 
glEnable(GL_TEXTURE_2D); 
glDisable(GL_DEPTH_TEST); 
glDisable(GL_LIGHTING); 
glDisable(GL_BLEND); 

glColor4f(1.0, 1.0, 1.0, 1.0); 

/*!!!!!!!!!!!!!! FRONT FACE !!!!!!!!!!!!!!!*/ 

glBindTexture(GL_TEXTURE_2D,frontTextureId); // select which texture to use 
glBegin(GL_QUADS); 
    glTexCoord2f(0, 0); glVertex3f( 0.5f, 0.5f, -0.5f); 
    glTexCoord2f(1, 0); glVertex3f(-0.5f, 0.5f, -0.5f); 
    glTexCoord2f(1, 1); glVertex3f(-0.5f, -0.5f, -0.5f); 
    glTexCoord2f(0, 1); glVertex3f( 0.5f, -0.5f, -0.5f); 
glEnd(); 

/*!!!!!!!!!!!!!! LEFT FACE !!!!!!!!!!!!!!!*/ 
glBindTexture(GL_TEXTURE_2D, leftTextureId); // select which texture to use 
glBegin(GL_QUADS); 
    glTexCoord2f(0, 0); glVertex3f( 0.5f, 0.5f, 0.5f); 
    glTexCoord2f(1, 0); glVertex3f( 0.5f, 0.5f, -0.5f); 
    glTexCoord2f(1, 1); glVertex3f( 0.5f, -0.5f, -0.5f); 
    glTexCoord2f(0, 1); glVertex3f( 0.5f, -0.5f, 0.5f); 
glEnd(); 

/*!!!!!!!!!!!!!! RIGHT FACE !!!!!!!!!!!!!!!*/ 
glBindTexture(GL_TEXTURE_2D, rightTextureId); // select which texture to use 
glBegin(GL_QUADS); 
    glTexCoord2f(0, 0); glVertex3f(-0.5f, 0.5f, -0.5f); 
    glTexCoord2f(1, 0); glVertex3f(-0.5f, 0.5f, 0.5f); 
    glTexCoord2f(1, 1); glVertex3f(-0.5f, -0.5f, 0.5f); 
    glTexCoord2f(0, 1); glVertex3f(-0.5f, -0.5f, -0.5f); 
glEnd(); 

/*!!!!!!!!!!!!!! BACK FACE !!!!!!!!!!!!!!!*/ 
glBindTexture(GL_TEXTURE_2D, backTextureId); // select which texture to use 
glBegin(GL_QUADS); 
    glTexCoord2f(0, 0); glVertex3f(-0.5f, 0.5f, 0.5f); 
    glTexCoord2f(1, 0); glVertex3f( 0.5f, 0.5f, 0.5f); 
    glTexCoord2f(1, 1); glVertex3f( 0.5f, -0.5f, 0.5f); 
    glTexCoord2f(0, 1); glVertex3f(-0.5f, -0.5f, 0.5f); 

glEnd(); 

/*!!!!!!!!!!!!!! TOP FACE !!!!!!!!!!!!!!!*/ 
glBindTexture(GL_TEXTURE_2D, upTextureId); // select which texture to use 
glBegin(GL_QUADS); 
    glTexCoord2f(0, 1); glVertex3f(-0.5f, 0.5f, -0.5f); 
    glTexCoord2f(0, 0); glVertex3f(-0.5f, 0.5f, 0.5f); 
    glTexCoord2f(1, 0); glVertex3f( 0.5f, 0.5f, 0.5f); 
    glTexCoord2f(1, 1); glVertex3f( 0.5f, 0.5f, -0.5f); 
glEnd(); 

/*!!!!!!!!!!!!!! BOTTOM FACE !!!!!!!!!!!!!!!*/ 
glBindTexture(GL_TEXTURE_2D, downTextureId); // select which texture to use 
glBegin(GL_QUADS); 
    glTexCoord2f(0, 0); glVertex3f(-0.5f, -0.5f, -0.5f); 
    glTexCoord2f(0, 1); glVertex3f(-0.5f, -0.5f, 0.5f); 
    glTexCoord2f(1, 1); glVertex3f( 0.5f, -0.5f, 0.5f); 
    glTexCoord2f(1, 0); glVertex3f( 0.5f, -0.5f, -0.5f); 
glEnd(); 

/*!!!!!!!!!!!!!! end of drawing of a textured quad !!!!!!!!!!!!!!!*/ 
glPopAttrib(); 
glPopMatrix(); 

/* Swap buffers, so one we just drew is displayed */ 
glutSwapBuffers(); 
} 

ここでは何か基本的なものが欠けているように感じますが、わかりません。コードはチュートリアルのサイト(http://sidvind.com/wiki/Skybox_tutorial)より多かれ少なかれ です。 コードはUbuntu Linuxでg ++ 4.5.2でコンパイルされましたが、同じ問題が Visual Studioでも発生します。

上記のコードで使用されている数値は、 がリンクされた画像を生成した値であることを示す必要があります。

答えて

3

テクスチャは、キューブのエッジをまたいでシームレスな結合を形成する必要があります。あなたが提供したスクリーンショットでは、これらの画像はシームレスな結合を形成しません(空を見てください)。

また、投影行列を確認してください - 透視変換を設定していますか?

は、透視投影(3Dアプリケーションのための最も一般的な)を設定する:

glMatrixMode(GL_PROJECTION); // switch to projection matrix 
glLoadIdentity(); // reset projection 
gluPerspective(90.0,4.0/3.0,0.01,10.0); // 90deg FOV, 4:3 aspect ratio, 0.01 near clip plane, 10.0 far clip plane 
glMatrixMode(GL_MODELVIEW); // back to model matrix 
+0

私が知る限り、私が与えた座標はシームレスなエッジを形成するはずです。カメラを軸に沿って(いずれかの方向に)指し示すと、ボックスの適切な面が表示されますが、ボックスの他の面ではなく黒で囲まれます。 gluLookAt関数を使用してパースペクティブを変更するだけですが、その呼び出しがなくても問題は解決しません。私は、z軸に沿って平行移動しようとすると、画像のサイズに変化はないことに気付きました。 – sabauma

+0

質問を編集して、投影行列を設定する場所にコードを追加できますか? ( 'glMatrixMode(GL_PROJECTION);の後のもの) – geofftnz

+0

私はglMatrixMode(これは私の問題です)への呼び出しを行っていません。 – sabauma

1

それは右のテクスチャのように私には見えますが、左の画像の左側にあるべき。だから私はあなたのキューブの間違った面をテクスチャリングしていると思います。

+0

可能ですが、それが私の主な問題を引き起こしているとは思いません。 – sabauma

関連する問題