2014-05-15 48 views
0

我想向我的GLSL着色器發送一個顏色屬性。發送規範化的頂點屬性會產生垃圾

顏色存儲在一個緊密排列的字節數組中,其中3個連續字節組成一個RGB三元組。 着色器需要vec3,所以我打電話glVertexAttribPointer向着色器發送標準化的浮點值。

glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]); 
glBufferData(GL_ARRAY_BUFFER, mesh.n_vertices() * 3 * sizeof(GLubyte), color, GL_STATIC_DRAW); 

// a little later 
glEnableVertexAttribArray(attributes[COLOR]); 
glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]); 
glVertexAttribPointer(attributes[COLOR], 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); 

發生什麼事是:

  1. 似乎是顏色不以在着色器到達,頂點都在一個綠色
  2. 應用彩色花費大量的性能損失

當我手動規範顏色值,將它們複製到一個浮點數組並將其發送到OpenGL它呈現沒有任何問題:

glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]); 
glBufferData(GL_ARRAY_BUFFER, mesh.n_vertices() * 3 * sizeof(GLfloat), colorf, GL_STATIC_DRAW); 

// a little later 
glEnableVertexAttribArray(attributes[COLOR]); 
glBindBuffer(GL_ARRAY_BUFFER, attributeBuffers[COLOR]); 
glVertexAttribPointer(attributes[COLOR], 3, GL_FLOAT, GL_FALSE, 0, 0); 

我在一個帶有OpenGL 3.0上下文的AMD圖形卡上測試了它。

這是怎麼發生的?我錯過了什麼嗎?

+1

這聽起來像是一個bug,但是再一次,每個頂點3個字節是GPU不友好的。嘗試傳遞4個字節,而不是填充第4個字節。 – Bahbar

+0

着色器實際上期望一個'vec4',你恰好只是定義了4個組件中的3個。這很好,但不要期待出色的性能,因爲這會導致內存訪問不對齊。有三種分量格式,可以用於頂點顏色,如'UNSIGNED_INT_10F_11F_11F_REV'。當然這是一種FP格式,但是你可以得出這樣的想法 - 三分量數據類型在打包到二的冪次(即使這意味着不均勻分佈的精度)時效果最好。 *爲你的步幅增加一個額外的1字節可以完成相同的任務。* –

+0

據我所知,你正在嘗試應該如何工作。我正在尋找規範中的對齊限制,並且大部分都是空的。我發現最接近「BufferData()」下的「客戶必須將數據元素與客戶平臺的要求保持一致」,但我認爲這不應該成爲一個問題。我肯定會嘗試上面提出的意見,並使用4個組件。通常,使用很少使用的數據類型和路線來獲得糟糕的性能並不罕見。某些硬件可能不會直接支持它們,並且驅動程序的支持功能不足。 –

回答

0

根據Bahbar的建議,我現在將色彩三元組對齊到32位,並且工作完美無瑕。顏色在着色器中正確到達,沒有任何性能問題。

+0

讓問題保持開放狀態,因爲這解決了我的問題,但我仍然對爲什麼會發生這種情況感興趣 – pezcode