2011-09-11 82 views
2

我是OpenGL的新手,並嘗試渲染天空盒時遇到了問題。 這幅圖很好地說明了這個問題。OpenGL 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