2016-11-30 65 views
0

這可能是一個愚蠢的問題,但我一直想知道 - 在OpenGL NEED中做頂點結構有x,y和z?我正在用2D繪圖,但我看過的所有教程似乎在其結構中都有一個z變量,即使它始終爲0。這是否會減慢渲染速度或某些內容?OpenGL ES:頂點結構是否需要x,y和z?

此外,他們似乎總是有顏色變量的r,g,b和a,但我不需要alpha,因爲它對我的項目總是1。我真的需要說每次都是1次嗎?

我只是想知道,因爲glVertexAttribPointer可以讓你設置第二個參數是任何東西,我嘗試將它設置爲2,因爲我只使用x和y,它的工作。

回答

2

spec 2.8節:

如果大小爲1,則的x分量該屬性由數組指定; y,z和w分別隱式設置爲零,零和1。如果size爲2,則該屬性的x和y分量由該數組指定; z和w分別隱式設置爲零和1。如果size是3,則指定x,y和z,並且w隱式設置爲1。如果大小爲四,則指定所有組件。

所以如果你沒有爲你的2D頂點定義z或w。頂點彙編程序用z = 0,w = 1自動填充它們。你的代碼是安全和正確的。

RGBA相同XYZW,所以你不必指定顏色成分阿爾法要麼假設你想阿爾法爲1

性能方面你通常應該會通過使用較小的頂點組件的勝利因爲更少的數據必須移動並複製到GPU。我希望任何性能增益都很小,可能無法衡量。

一個例外是,如果您從頂點削減幾個字節並將其從一個漂亮的高速緩存友好的16字節減少到每個頂點的12字節,則可能會略微降低性能,因爲8,16,32字節就內存訪問而言,大小有點神奇。再一次,這裏的任何性能損失都會很小,所以我不會讓它麻煩你。

0

是的,總是需要一個Z,它是一個3D渲染器,當你在做二維的東西時,你只是利用3D渲染器來真正做2D(使用正投影而不是透視),你仍然可以使用Z來製作某些物體位於其他物體之上,這是有用的。據我所知,着色器中的gl_Position變量實際上是一個vec4,所以它會有一個Z和W分量,我認爲如果你使用的是vec2,所以只有X和Y,Z和W將得到默認值,或者你將不得不將它轉換爲着色器中的vec4,我不記得了。

+0

我認爲OP詢問輸入頂點是否需要通過glVertexAttribPointer獲得z,但是您正在回答着色器是否需要寫入gl_Position的z分量。 – Columbo

+0

@Columbo是好點,我想我錯過了一點情節。你的答案更精確 – Fonix

1

如果您刪除了z,您將不會注意到改進,因爲儘管您只是將它用於2D渲染,但OpenGL仍會執行3D渲染。但是,你獲得記憶。所以你可以移除z並讓glVertexAttribPointer的第二個參數爲2,但要注意如何操作着色器中的向量。

這可以被認爲是過度優化,但如果您願意,可以禁用深度渲染,以便在安裝過程中通過調用glDisable (GL_DEPTH_TEST)來呈現對象,使其按照它們的呈現順序回到前面。 In openGL, how can you get items to draw back to front?

對於非透明圖像,則可以將其加載到GPU作爲GL_RGB類型:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, each.w, each.h, 0, GL_RGB, GL_UNSIGNED_BYTE, each.image) 
相關問題