我想向我的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);
發生什麼事是:
- 似乎是顏色不以在着色器到達,頂點都在一個綠色
- 應用彩色花費大量的性能損失
當我手動規範顏色值,將它們複製到一個浮點數組並將其發送到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圖形卡上測試了它。
這是怎麼發生的?我錯過了什麼嗎?
這聽起來像是一個bug,但是再一次,每個頂點3個字節是GPU不友好的。嘗試傳遞4個字節,而不是填充第4個字節。 – Bahbar
着色器實際上期望一個'vec4',你恰好只是定義了4個組件中的3個。這很好,但不要期待出色的性能,因爲這會導致內存訪問不對齊。有三種分量格式,可以用於頂點顏色,如'UNSIGNED_INT_10F_11F_11F_REV'。當然這是一種FP格式,但是你可以得出這樣的想法 - 三分量數據類型在打包到二的冪次(即使這意味着不均勻分佈的精度)時效果最好。 *爲你的步幅增加一個額外的1字節可以完成相同的任務。* –
據我所知,你正在嘗試應該如何工作。我正在尋找規範中的對齊限制,並且大部分都是空的。我發現最接近「BufferData()」下的「客戶必須將數據元素與客戶平臺的要求保持一致」,但我認爲這不應該成爲一個問題。我肯定會嘗試上面提出的意見,並使用4個組件。通常,使用很少使用的數據類型和路線來獲得糟糕的性能並不罕見。某些硬件可能不會直接支持它們,並且驅動程序的支持功能不足。 –