簡體   English   中英

C ++和DirectX-設置着色器

[英]C++ & DirectX - setting shader

有人知道通過DirectX調用着色器處理的快速方法嗎?

現在,我正在使用D3DXCreateEffectFromFile調用設置着色器,該調用會在運行時從*.fx文件創建着色器(每個着色器一次)

每個對象的渲染部分( 在我的情況下為每個補丁-進一步了解 )意味着:

// --------------------
// Preprocessing
effect->Begin();
effect->BeginPass(0);
effect->SetMatrix (or Vector or whatever - internal shader parameters) (...)
effect->CommitChanges();

// --------------------
// Geometry rendering

// Pass the geometry to render
// ...

// --------------------
// Postprocessing

// End 'effect' passes
effect->EndPass();
effect->End();

沒關系,但是探查器顯示的東西很奇怪- preprocessing (請參見代碼)花費約60%的時間(我正在渲染256個補丁的terrain對象,其中每個補丁包含約1萬個頂點)

實際的幾何渲染大約需要35%的時間,而后期處理則需要總渲染時間的5%。

這對我來說似乎很奇怪,我想D3DXEffect接口可能不是這種事情的最佳解決方案。

我有2個問題:

1.我是否需要實現自己的着色器控制器/包裝器(可能是低級的),我應該從哪里開始?

2.編譯着色器是否有助於提高參數設置性能?

也許有人知道如何解決此類問題/一些已實現的着色器接口,或者可以就現代游戲引擎中如何解決此類問題提供一些建議。

謝謝。

實際的幾何渲染大約需要35%的時間,而后期處理則需要總渲染時間的5%

如果要分析着色器性能,則需要使用NVPerfHud或類似方法。 使用CPU事件探查器和測量刻度不會對您有幫助-渲染通常是異步的。

我是否需要實現自己的着色器控制器/包裝器(可能是低級的)

使用您自己的着色器包裝器不是一個壞主意-無論如何我從來都不喜歡ID3DXEffect。 使用您自己的包裝器,您將完全控制資源和程序行為。 是否需要由您決定。 使用ID3DXEffect,您將無法保證實施速度盡可能快-這可能是在浪費CPU周期來做您實際上不需要的事情。 D3DX庫包含一些有用的類,但不能保證它們是有效的(ID3DXEffect,ID3DXMesh,所有與動畫有關的和與皮膚有關的功能,等等)。

我應該從哪里開始?

DirectX 9上的D3DXAssembleShader,IDirect3DDevice9 :: CreateVertexShader,IDirect3DDevice9 :: CreatePixelShader,DirectX 10上的D3D10CompileShader。另請下載DirectX SDK並閱讀着色器文檔/教程。

編譯着色器有助於以某種方式提高參數設置性能嗎?

加載着色器時,它們會自動編譯。 您可以使用其他優化設置進行編譯,但是不要指望奇跡。

您是在使用DirectX探查器還是只是在計時您的客戶端代碼? 使用客戶端代碼中的計時器來分析DirectX API調用通常效果不佳,因為在您進行狀態更新/繪制調用時並不一定同步處理它們。 幕后進行了很多優化。 這是有關DX9的文章,但我確定對於更高版本,它沒有改變:

http://msdn.microsoft.com/zh-CN/library/bb172234(VS.85).aspx

  1. 我之前在DirectX中使用過效果,並且系統通常可以正常運行。 它提供了一些不錯的功能,這些功能可能會使您在較低級別上實現起來很麻煩,因此我暫時堅持使用它。

    如前所述,您的時間信息可能不准確。 相比之下,聽起來圖紙實際花費的時間最多。

  2. 着色器在加載時進行編譯。 預編譯將為您節省半秒的啟動時間,但是只要着色器在運行時不變,您就不會看到任何實際的速度提高。 如果仍在測試着色器,則預編譯也很麻煩。 您可以使用最終副本進行此操作,但是除非您有很多着色器,否則在加載它們時不會有太多好處。

    如果要在每幀或每次渲染幾何體時創建着色器,則可能是問題所在。 除非着色器本身(而不是參數)每幀更改一次,否則您應該只創建一次效果並重新使用它。

    我不記得SetParameter調用的去向,但您可能需要檢查文檔以確保SetMatrix正確。 傳遞開始后設置參數將無濟於事,當然不能提高速度。 確保設置正確。 此外,設置參數的可能性應盡可能少,這會涉及一些開銷。 如果設置過多,則每幀設置會明顯降低速度。

總而言之,效果系統在大多數情況下都可以正常工作,您不應該看到自己的狀態。 確保配置文件正確,着色器有效且已優化,並且調用位置正確。

暫無
暫無

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

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