2013-06-30 34 views
0

我正在用靜態和動畫(包括骨骼動畫)網格編寫3D圖形應用程序(使用SharpDX)。有些網格只會每幀渲染一次,有些會渲染很多次。爲了加速渲染,我打算利用硬件實例。「單個實例」的硬件實例化的缺點

與其實施實例化和非實例化渲染例程併爲每個網格選擇正確的渲染例程,我想到了簡單地對所有網格使用實例渲染會更容易。

假設目標硬件支持硬件實例化,使用硬件實例化繪製所有網格是否存在任何缺陷,即使它們每幀只出現一次?

+0

你試過了嗎? –

回答

1

我想這可能會慢一點,因爲你引入一個額外的緩衝區綁定來設置實例緩衝區。因此,每個網格需要渲染2-3個緩衝區(頂點緩衝區,實例緩衝區和可能的索引緩衝區),而不僅僅是1-2(vb和ib)。

像往常一樣,如果它有助於標準化引擎,並且不會遇到任何明顯的缺點,那麼就不需要優化。唯一的方法是知道你的應用程序的這兩個變種。

+0

我遇到的另一個缺點是每個對象常量不再存在於一個常量緩衝區中,而是添加到着色器結構中。如果像素着色器需要常量,則必須通過光柵器等。 – gareththegeek

1

在做這件事情時,你會對輸入彙編器做更多的工作,但是對於實例/非實例我只做了高分辨率球體和時間戳的快速測試,結果幾乎相同。

請注意我在實例化版本中使用結構化緩衝區(做一些查找替換)。

此外,既然你提到你將使用蒙皮,你的情況下潛在成本將被最小化(因爲你的頂點着色器將不得不做很多工作)。

爲了避免根據您的評論添加到着色器結構中,還可以使用StructuredBuffers並使用SV_InstanceID或SV_VertexID進行查找,這比每個實例頂點緩衝區更靈活(知道您也可以抵消計算中的一些工作後期着色器更容易)。

+0

感謝關於StructuredBuffers的提示,我之前沒有遇到過這種技術。我會仔細看看的! – gareththegeek