2013-09-21 47 views
11

我已閱讀了一些關於GLSL的教程。 在某些位置屬性是一些vec3中的vec4。 我知道矩陣運算需要一個vec4,但它值得發送一個額外的元素? 發送vec3並稍後投射到着色器vec4(位置1.0)不是更好嗎? 內存中的數據較少 - 會更快嗎?或者我們應該包裝一個額外的元素來避免施放?着色器位置vec4或vec3

任何提示什麼應該更好?

layout(location = 0) in vec4 position; 
MVP*position; 

layout(location = 0) in vec3 position; 
MVP*vec4(position,1.0); 

回答

19

對於頂點屬性,這並不重要。缺席時,第四個組件會自動擴展到1.0

也就是說,如果您將3維頂點屬性指針傳遞給4維向量,GL將爲您填充W1.0。我總是走這條路線,避免了在位置上進行矩陣乘法時明確寫出vec4 (...),也避免了浪費存儲第四個分量的內存。

順便說一下,這也適用於二維座標。傳遞給vec4屬性的2D座標變爲vec4 (x, y, 0.0, 1.0)。一般規則是這樣的:除W之外,所有丟失的組件被替換爲0.0,替換爲1.0

但是,對於在這種情況下不知道GLSL行爲的人來說,這可能會令人困惑。我想這就是爲什麼大多數教程從未觸及過這個話題。

+0

是否表示可以使用: glBufferSubData(GL_ARRAY_BUFFER,0,vertex * 3,data); glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0); 和着色器在vec4位置使用 「佈局(位置= 0);」表達? – Skides

+2

是的,這就是這個意思。如果你這樣做,GLSL每次嘗試訪問時都會爲W添加一個1.0。 –

+0

只是一個額外的問題:這是否適用於超過'GLfloat'?也就是說,dvec2' - >'dvec4'或'ivec2' - >'ivec4'會出現同樣的擴展嗎? – ThePhD

相關問題