2011-09-02 80 views
4

我想使用頂點數組來繪製一個相當大的網格,其中包含大量的頂點。紋理已經從這些決定,這是很容易在即時模式下繪製的線沿線:在OpenGL中結合頂點數組和紋理

glBegin(GL_TRIANGLES) { 
    for (int faceIdx = 0; faceIdx < nFaces; ++faceIdx) 
    glVertex3fv(&vertexArray[vIdx]); 
    glTexCoord2fv(&texCoord[vIdx++]); 
    glVertex3fv(&vertexArray[vIdx]); 
    glTexCoord2fv(&texCoord[vIdx++]);  
    glVertex3fv(&vertexArray[vIdx]); 
    glTexCoord2fv(&texCoord[vIdx++]); 
    } 
} 
glEnd(); 

但是爲了可讀性,速度和我想用頂點數組(以期剩下的移動到維也納組織)。有沒有辦法多次將單個頂點放入數組中?

據我瞭解,目前有必要指定網格的每個頂點的次數,因爲它出現在網格的一個面上,因爲每個頂點都標識爲多個紋理座標(紋理是從實時圖像中捕獲的,網格近似的對象的世界圖像),即我的頂點/ tex座標數組讀取就好像我在即時模式下填充它。

是否有任何方式使用頂點數組,同時指定紋理座標,而不使用冗餘(我指的是重複的)頂點?

+0

幾天前我問了一個(遠程)類似的問題:http://stackoverflow.com/questions/7232915/fewer-colors-than-vertices –

+1

我在上面的代碼中看不到您的問題。頂點位置和紋理座標可以共享索引,但是您正在使用每個頂點前進索引。順便說一句,我認爲你得到的調用順序搞砸了:在所有其他屬性設置完成後調用glVertex。在glBegin中... glEnd塊最後一個OpenGL命令應該是glVertex – datenwolf

回答

5

單個頂點由組成該單個頂點的所有屬性組成。因此,共享相同位置但具有不同紋理座標的兩個頂點在概念上是不同的頂點。所以不行,圍繞不同的texCoords重複頂點位置沒有簡單的方法。

但是通常這樣的頂點重複僅僅在一些稀有區域是必要的(比如鋒利的邊緣,因爲不同的法線,或者像你的情況紋理接縫)。所以你所有的面孔的角落真的有不同的texCoords?也許你可以預先處理你的數據,並找到相鄰的面共享位置 texCoords,因此可以共享頂點。如果許多頂點不是這種情況,那麼我會感到驚訝,並且最終只有一小堆重複的頂點。

+0

Thankyou - 其中一個'很高興有答案,但希望這是一個不同'的情況。然而,它完全有道理 - 我只需要看看按摩紋理文件以限制重複。 – northerncodemonkey

-1

如果我理解你的問題是正確的,那麼確實有辦法擺脫必須將多個相同頂點放入頂點緩衝區的方法。您可以使用索引緩衝區並使用索引來指定相同的頂點。這可以顯着提高渲染速度。

+0

感謝您的快速回答,但問題是網格中的單個頂點可以對應多個(例如3個)紋理座標。將紋理排除在等式之外,我們確實可以使用索引繪圖,但是如果頂點A出現在2個面中,因此在我們的與2(s,t)對相對應的紋理方案中,似乎沒有辦法使用索引繪圖來實現此目的因爲我們無法指定所需的多個(s,t)對。 – northerncodemonkey