2012-10-06 54 views
1

這是我製作cube map的嘗試。在lwjgl中製作立方體貼圖

glDisable(GL_TEXTURE_2D); 
glEnable(GL_TEXTURE_CUBE_MAP); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
PNGDecoder pngDecoder = new PNGDecoder(ResourceLoader.getResourceAsStream("C:/desert_skymap_sample.png")); 
ByteBuffer temp = ByteBuffer.allocateDirect(4*pngDecoder.getWidth() * pngDecoder.getHeight()); 
pngDecoder.decode(temp, pngDecoder.getWidth()*4, PNGDecoder.Format.RGBA); 
temp.flip(); 
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp); 
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp); 
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp); 
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp); 
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp); 
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,0,GL_RGBA,pngDecoder.getWidth(), pngDecoder.getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,temp); 


    gluLookAt(0,0,0, xtrans+xpos,ytrans+walkbias,ztrans+zpos, 0,1,0); 

    glPushAttrib(GL_ENABLE_BIT); 
    glDisable(GL_DEPTH_TEST); 

    glColor4f(1,1,1,1); 

    glBindTexture(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_POSITIVE_X); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0, 0); 
     glVertex3f(1f, -1f, -1f); 
     glTexCoord2f(1, 0); 
     glVertex3f(-1f, -1f, -1f); 
     glTexCoord2f(1, 1); 
     glVertex3f(-1f, 1f, -1f); 
     glTexCoord2f(0, 1); 
     glVertex3f(1f, 1f, -1f); 
    glEnd(); 

    glBindTexture(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_NEGETIVE_X); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0, 0); 
     glVertex3f(1f, -1f, 1f); 
     glTexCoord2f(1, 0); 
     glVertex3f(1f, -1f, -1f); 
     glTexCoord2f(1, 1); 
     glVertex3f(1f, 1f, -1f); 
     glTexCoord2f(0, 1); 
     glVertex3f(1f, 1f, 1f); 
    glEnd(); 

我正在使用TWL的PngDecoder。該問題是我不知道如何獲得紋理ID/retreve TexImage2D或如果我正確地做到了這一點。

如何在LWJGL中製作立方體貼圖?

回答

1

我想你會想在開始的某個地方撥打gluLookAt,以便正確設置相機轉換。

看一看:

在上面的例子中camera->x, camera->y, camera->z元素應該描述您的相機正在尋找方向的矢量來代替。

+0

這是什麼語法?相機 - > x? – Coupon22

+0

這個答案有幫助,而且足夠好。我仍然需要立方體貼圖幫助,但對於原始的天空盒問題,這很好。 – Coupon22

1

還有,你將需要添加到代碼得到它的工作的幾件事情:

  1. 作爲mikera提到的,你需要設置與glLookAt「相機」。
  2. 您還需要定義渲染紋理的幾何圖形。最簡單的方法是在2d空間的相機周圍定義一個盒子。不要忘記設置面部法線。

有關於硬件立方體映射相當廣泛的寫了這裏的OpenGL(這是一個多廠商擴展):http://www.nvidia.com/object/cube_map_ogl_tutorial.html

+0

我看了那篇教程,但是當我試圖運行這個例子時,它沒有GL_EXT_TEXTURE_CUBE_MAP而運行錯誤。我不明白錯誤,我有OpenGL 3.0。 – Coupon22

+0

另外,你在說什麼2號? – Coupon22

+0

我看到您現在已經在原始問題中添加了繪圖代碼。與第2點我的意思是,你需要設置一些幾何體來映射立方體紋理(正如我所說,最初我看不到你的繪製代碼)。此外,根據我鏈接的文章,一些生成的紋理座標取決於您在幾何圖形上正確設置頂點法線。 –