請問OpenGL的的頂點數據中position必須與color一一對應嗎?
01-26
能不能一組position對應一個color?
作為頂點屬性的話,每個頂點都需要一個color
作為uniform變數的話,大家只能用一個或者你這麼倒過來想:一組position對應一個color,那麼如何把「什麼是一組」這個信息傳給GPU呢?這麼傳和直接每個position對應一個color比有什麼優劣
不確定題主是不是想問instancing這個東西,如果是當然有辦法了,比如說有多個相同的物體,只是位置和顏色不同,這種情況多用於植被之類大量重複物體的渲染,只需要存儲一份所有實例共享的幾何數據,每個實例不同的屬性則用另外一個buffer存儲(比如顏色,位置,旋轉,縮放),然後調用glAttribDivisor即可指定當前的attribute的更新頻率(是逐頂點去更新呢還是逐實例更新還是每幾個實例更新一次),最後調用glDrawInstancedxxx方法即可批量渲染,這樣的做法節約顯存並且高度靈活,更高級的玩法是同一個角色有多個實例,但除了位置不同外連骨骼動畫動作也各不相同,這種可以用骨骼調色板的技術去批次渲染,具體做法可參見gpu gems3裡面的相關文章。
你如果只是想一個物體的所有頂點都是某個顏色的話,畫之前設置一次color就可以了。(OpenGL 1.1)
如果你是想一個物體的某些頂點都是某個顏色的話,使用VBO來指定顏色緩衝是比較高效的做法。(OpenGL 2.0+)
如果你是想一個物體的某些頂點都是某個顏色,並且不想讓頂點和顏色個數對等的話,可以使用instanced draw,不過你的顏色-頂點的關係需要滿足glVertexAttribDivisor的限制(一般出現在用一組position繪製多個不同顏色的物體)。(OpenGL 3.0+)
用vertex array,禁止使用glBegin和glEnd函數,題主就不會受到困惑了。
可以multi stream,存index,去另外一個stream取,那麼index可以是一個byte,比color節省也可以instance,設定屬性的跨距。
你就是不想一個個寫過來吧?
實際的情況是頂點色是美術刷的,刷下來的就有很多漸變色,不好多頂點對應一個 color。
如果要這樣,你要有 Colors[] 數組,每刷一筆,這個數組的長度和內容都可能要更新,頂點數據的 color index 也要更新。。數據是自己組織的,想怎麼玩都行。建議先搞明白vertex attribute和uniform變數的區別。
uniform vec4 uVertexColor;每個頂點顏色使用這個變數賦值。但是如果是頂點屬性的話,需要一一對應,就跟紋理坐標對應類似。
OpenGL繪製的時候是要求每個頂點制定一個顏色,片元著色器就是可以做這種任務。可以給一個buffer指定一種顏色。如果場景要分很多部分的話可以多啟用幾個buffer,每個buffer指定顏色。
推薦閱讀:
※如何正確理解 opengl 的 vao ?
※一直說要對不同渲染狀態的對象進行排序 但是排序的優先順序應該是什麼呢?
※Minecraft那些方塊用OpenGL怎麼畫比較好?
※Unity-Shader和OpenGL-Shader有什麼不同之處?