簡體   English   中英

GLSL每個頂點固定大小的數組

[英]GLSL per vertex fixed size array

在桌面GLSL中是否可以將固定大小的浮點數組作為屬性傳遞給頂點着色器? 如果有,怎么樣?

我想為角色動畫設置每個頂點權重,所以我想在頂點着色器中使用以下內容:

attribute float weights[25];

我如何從C ++和OpenGL程序中填充屬性數組? 我在另一個問題中看到我可以獲取數組屬性的屬性位置,然后只需將索引添加到該位置。 有人可以為我的大型數組提供一個例子嗎?

謝謝。

讓我們從你要求的開始。

幾乎沒有當前存在的硬件將attribute float weights[25]; 編譯。 着色器可以具有屬性數組,而每個數組索引代表一個新的屬性索引。 在目前存在的所有硬件上,屬性索引的最大數量是...... 16.你需要25,這只是權重。

現在,您可以通過記住可以使用vec4屬性來輕松地緩解這一問題。 因此,您將每四個數組元素存儲在一個屬性中。 你的數組將是attribute vec4 weights[7]; 這是可行的。 你的舉重邏輯當然必須改變。

即便如此,您似乎並沒有考慮到這對您的頂點數據實際意味着什么。 每個屬性代表頂點數據的一個組成部分。 渲染調用的每個頂點將具有相同數量的數據; 該數據的內容會有所不同,但不會有多少數據。

為了做你所建議的,網格中的每個頂點都需要25個浮點數來描述權重。 即使將其存儲為規范化的無符號字節,這仍然是至少25個額外字節的數據。 好多啊。 特別是考慮到絕大多數頂點,大多數這些值都是0.即使在最壞的情況下,你也可能會看到影響單個頂點的6-7個骨骼。

通常在頂點着色器中完成蒙皮的方法是將影響單個頂點的骨骼數量限制為四個 這樣,您就不會使用屬性數組; 你只需要使用vec4屬性作為權重。 當然,您現在還需要說明哪個骨骼與哪個骨骼相關聯。 因此,您有第二個vec4屬性,指定該權重的骨骼索引。

這達到了很好的平衡。 您只需要占用2個額外屬性(就大小而言可以是無符號字節)。 對於絕大多數頂點,您甚至都不會注意到,因為大多數頂點僅受1-3個骨骼的影響。 少數使用4,少數使用5+。 在這些情況下,您只需按比例切斷最低權重並重新計算其他權重。

Nicol Bolas已經給你一個如何重組你的任務的答案。 你應該這樣做,因為為一個頂點處理25個浮點數,可能通過一些四元數乘法會浪費很多好的GPU處理能力; 無論如何,頂點的大多數屬性都將轉換為接近身份轉換。

但是出於學術原因,我將告訴你,如何在每個頂點傳遞25個浮點數。 關鍵是不使用屬性,而是從某個緩沖區(紋理)中獲取數據。 GLSL頂點着色器階段具有內置變量gl_VertexID ,它傳遞當前處理的頂點的索引。 使用最近的OpenGL,您也可以從頂點着色器訪問紋理。 所以你有一個大小為vertex_count × 25的紋理來保存這些值。 在您的頂點着色器中,您可以使用texelFetch函數訪問它們,即texelFetch(param_buffer, vec2(gl_VertexID, 3));

如果在骨架動畫中使用,則此系統通常稱為紋理蒙皮 然而,它應該謹慎使用,因為它是一個真正的性能豬。 但有時候你無法避免它,例如當你實現一個面部動畫系統,你需要將所有頂點加權到26個肌肉,如果你想要准確地模擬人臉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM