2013-01-24 319 views
5

紋理立方體的最佳方式(最低內存,最快速度)是多少?過了一會兒,我必須找到這個解決方案:在openGL中紋理立方體的最佳方式

數據結構:

GLfloat Cube::vertices[] = 
{-0.5f, 0.0f, 0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 1.0f, 0.5f, -0.5f, 1.0f, 0.5f, 
    -0.5f, 1.0f, -0.5f, 0.5f, 1.0f, -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, -0.5f, 
    0.5f, 0.0f, 0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 1.0f, -0.5f, 0.5f, 1.0f, 0.5f, 
    -0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 1.0f, 0.5f, -0.5f, 1.0f, -0.5f 
    }; 

GLfloat Cube::texcoords[] = { 0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0 
          }; 

GLubyte Cube::cubeIndices[24] = {0,1,2,3, 4,5,6,7, 3,2,5,4, 7,6,1,0, 
            8,9,10,11, 12,13,14,15}; 

繪製函數:

 glEnable(GL_TEXTURE_2D); 
     glBindTexture(GL_TEXTURE_2D, texture); 
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
     glColor3f(1.0f, 1.0f, 1.0f); 

     glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
     glEnableClientState(GL_VERTEX_ARRAY); 

     glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 
     glVertexPointer(3, GL_FLOAT, 0, vertices); 

     glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices); 
     glDisableClientState(GL_VERTEX_ARRAY); 
     //glDisableClientState(GL_COLOR_ARRAY); 
     glDisable(GL_TEXTURE_2D); 

正如你所看到的結果是正確的: cube

但rech這個結果我不得不重新定義一些頂點(在vertices數組中有16個3D點),否則紋理無法映射到第e DrawElement函數。

有人知道更好的方法來紋理頂點數組中的立方體嗎?

+3

爲什麼你需要「最快/最低的內存」,你計劃在屏幕上擁有十億個立方體嗎?另外,你是什麼意思「重新定義某個頂點」? –

+0

設置了立方體紋理後,fps下降(從60到40)。我已經重新定義了「頂點」數組中的某個頂點,如果仔細觀察,該數組中有16個點(3D),但定義一個立方體8就足夠了。 – Luca

+2

你正在做的事情非常錯誤,它可能不是立方體,8或16個頂點不會有什麼不同。還要考慮每個頂點連接3個面,並且它們都具有不同的UV座標,則需要這些「額外」頂點。我不確定,但是當你創建紋理時,你只需要調用glTexParameteri一次,如果這是你的循環,它可能是減速的原因。 –

回答

1

我碰到同樣的問題,回去使用opengl es。我的研究表明,沒有其他方法可以做到這一點,因爲每個頂點只能有一個與之關聯的紋理座標。

0

那麼,你可以使用立方體貼圖紋理,其中你的頂點着色器將處理紋理座標。所有你需要做的產生TEX座標爲加入這一行你的頂點着色器:

out vec2 texcoords; 
texcoords=normalize(vertex_data.xy) 

無需重新頂點,也可以提高使用頂點緩衝對象的性能。

+0

這對我來說早就使用了着色器 – Luca

+0

我不明白你是什麼意思「對我來說早」..? – debonair

+0

我是openGl世界的新手,我只是在學習基礎 – Luca