我找不到任何有關如何在HLSL中獲取數組長度的文檔或示例。HLSL中的數組長度?
我將一列燈光推到hlsl着色器上,我想做一個for(int i=0; i<foo.length; i++)
( - 不是正確的語法)。
是不可能獲得數組的長度?我必須從C++端將數組長度整數推送給hlsl着色器嗎?
此外,我如何才能找出我的着色器中可以使用的最大循環次數? (由於循環展開,應該有一個限制。)
我找不到任何有關如何在HLSL中獲取數組長度的文檔或示例。HLSL中的數組長度?
我將一列燈光推到hlsl着色器上,我想做一個for(int i=0; i<foo.length; i++)
( - 不是正確的語法)。
是不可能獲得數組的長度?我必須從C++端將數組長度整數推送給hlsl着色器嗎?
此外,我如何才能找出我的着色器中可以使用的最大循環次數? (由於循環展開,應該有一個限制。)
據我所知,你必須聲明具有預定義長度的數組(Array syntax needs a positive integer as size)。如果現在使用任意數量的數據從extern填充此固定數組,HLSL無法知道這一點。所以你需要將數組長度傳遞給着色器。
如果您正在使用着色器模型3.0+並且未在之前指定[unroll]
,則循環不會自動展開。 (doc)
如果沒有屬性指定的編譯器將首先嚐試發射循環的推出的版本,如果失敗,或者如果循環被展開的一些操作會更容易些,將回退到循環的展開版本。
所以沒有允許的最大循環計數,但依賴於你所使用的着色器模型,還有一個最大執行指令數(wiki),另外有重置圖形設備的窗口看門狗,如果它需要的不僅僅是更多2秒渲染(doc),例如無限循環。
是的,這是很有道理的。 hlsl數組不是一個神奇地保存長度值的結構。在我的情況下,我通過虛幻引擎C++端向着色器發送資源,這使得這些特定的陣列在着色器代碼中「神奇地」和不可見。 – Spectraljump