[英]OpenGL: Rendering lots of cubes
我正在嘗試創建一個包含單元立方體(或球體)的600x600x600網格。 僅存在一些多維數據集。 因此,基本上,我正在嘗試使類似以下內容的小立方體或小球組成。
問題1 :渲染這樣的結構成本很高。 它需要3個嵌套循環(每個循環600次)。 有什么辦法可以解決嗎?
我的想法是將附近的多維數據集合並為一個(八叉樹),因為在我的案例中不會有太多的空白。 但是我想要一個通用的解決方案。 您認為將這樣的場景渲染到上方會花費多長時間(好像是250x250x250的場景)?
問題2 :實例渲染與我的問題有關嗎?
注意 :在這里,我將體素表示為一個立方體,而該立方體又需要6個四邊形。
我過去曾經做過體素渲染引擎。 以下是一些我建議的快速優化方法,它們可以為您帶來良好的速度提升:
正確完成這三件事,將為您帶來很大的提升。 之后,可以根據您的需求和要求進行微調。
確實,可以通過將各種多維數據集組合為一個大多維數據集來處理問題1。 體素引擎通常將多個單獨的盒子分組在一起。 那也許是最好的方法。 其次,可以為每個體素以及包含這些體素的塊使用布爾變量,並將其設置為1進行渲染,否則設置為0。 根據您的要求,您將需要一個體素類,一個塊類以及一些其他抽象。
也許創建一個幾何着色器,為網格中的每個點復制一個框。 對智能着色器進行編程,以使其不會輸出背離View的面,也不會輸出相鄰的“活動”框的面。
問題是為幾何着色器提供600 * 600 * 600大小的布爾值。 如果復合“對象”有些堅固,則可能只需要在多維數據集的每一行/列上提供開始和結束位置,因此:1,4,90,345表示使用多維數據集從1填充到4,從90填充到345。
問題1:
我不知道您如何提出3個嵌套循環。 我看到一個600 ^ 3體素的巨大循環。 您要做的最后一件事是逐個渲染每個體素,因為您的GPU是流式多核處理器,並且您的數據幾乎相同,除了空間轉換。 公平地說,這個數字可能有點太高了。 目前,在11ms的渲染時間大約需要64.000個多維數據集,但是如果您具有靜態場景設置,則可能會更快地獲得它。 請參閱: SVO渲染:OpenGL還是自定義渲染器?
您可以做的另一件事是將場景LOD,即僅渲染真正必要的場景。 您是否對遠處的體素感興趣? 如果它們具有亞像素大小,則可以代替渲染四元冒號。
問題2:
與VBO和VAO一樣,實例渲染無疑是解決方案的一部分,但還有其他方法,例如僅發送坐標並在幾何着色器中生成實際幾何。 另請參見http://sol.gfxile.net/instancing.html
如果您有靜態場景,則性能可以再提高近5倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.