簡體   English   中英

如何在OpenGL中有效處理大量的每個頂點屬性?

[英]How do I efficiently handle a large number of per vertex attributes in OpenGL?

我計算頂點着色器輸出所需的每個頂點屬性的數量大於GL_MAX_VERTEX_ATTRIBS。 有沒有一種有效的方法可以使用統一的索引數組指向多個緩沖區並以這種方式訪問​​每個頂點數據?

這是硬件限制所以簡短的答案是否定的。 如果您考慮使用其他方法的解決方法,例如使用也有限制的制服,那么這也是一種無法解決的問題。

我能想到的另一種可能的方法是從紋理中獲取額外的數據。 由於您可以從頂點着色器訪問紋理,但不支持紋理過濾(您不需要它,因此對您來說無關緊要)。 使用更新的OpenGL可以在紋理中存儲相當大量的數據並且即使在頂點着色器中也可以無限制地訪問它們,這似乎是一種方法。

用這種方法來說,你需要面對一個問題,你怎么知道當前的指數,即它是哪個頂點? 您可以檢查內置的gl_VertexID。

您可以繞過輸入匯編程序並綁定SSBO或紋理中的額外屬性。 然后你可以在頂點着色器中使用gl_VertexID來獲取你當前渲染的索引緩沖區條目的值(例如:你需要讀取的頂點數據中的索引)

因此,例如在VS中,以下代碼基本相同(但根據您的硬件,它可能具有不同的性能特征)

in vec3 myAttr;

void main() {
 vec3 vertexValue = myAttr;
 //etc
}

buffer myAttrBuffer {
 vec3 myAttr[];
};

void main() {
 vec3 vertexValue = myAttr[gl_VertexID];
 //etc
} 

CPU端綁定代碼是不同的,但通常這是概念。 myAttr計入GL_MAX_VERTEX_ATTRIBS,但myAttrBuffer沒有,因為它由着色器顯式加載。

在兩種情況下,您甚至可以通過綁定不同的目標來使用相同的緩沖區對象。

如果你不能絕對限制自己GL_MAX_VERTEX_ATTRIBS屬性,我會建議使用多通道着色器。 重新設計代碼以在第一遍中使用具有一組屬性的數據,並在第二遍中使用剩余的數據。

暫無
暫無

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

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