2011-06-10 114 views
3

我一直在尋找無處不在,我可以找到的所有關於着色器的教程。他們沒有向我展示如何將它們融入我的場景。加載和使用HLSL着色器?

所以基本上:

給定一個HLSL着色,如果我有一個名爲drawTexturedQuad()函數,我想着色器被應用到的結果,到底我怎麼能做到這一點?

感謝

回答

3

ID3DXEffect提供Begin()BeginPass()方法。在此期間,請致電drawQuad()。任何有關着色器的基本教程都應該顯示這樣的示例。

只是附加註釋 - 如有疑問,請詢問MSDN

1

這個問題的答案非常複雜,而且越來越困難,因爲GPU硬件越來越強大。 D3DX FX系統是需要完成的所有工作的一個例子,所以使用這個工具是爲短期使用而工作的一個很好的步驟。

着色器是代碼,但它們位於CPU的另一臺機器上,因此需要整理其所有數據。固定部分:基本渲染狀態,如深度狀態,模板狀態,混合模式,繪圖命令;非常容易實現。困難的部分是爲可編程部件搭建橋樑:着色器,緩衝區,採樣器和紋理。

索引緩衝區正常工作,因爲在渲染未索引的幾何體的情況下,只能有一個,或者沒有。

頂點緩衝區或多或少相當容易處理,因爲硬件可以被編程爲程序性地讀取頂點緩衝區。您的頂點緩衝區只需提供至少與頂點着色器想要訪問的信息相同的信息。修改着色器的頂點輸入,或者需要同時編輯雙方的頂點格式,所以相當容易處理。

取樣器和紋理是硬件的下一個'更容易',它們有一個變量名稱和一個相當剛性的類型。例如,在編譯着色器'foo',紋理'myNormalMap'時,會分配紋理槽3.您需要查看(通過反射API)紋理分配到哪個槽,並將引擎認爲是'myNormalMap'的紋理設置爲在運行時插入到插槽3中,當然也可以使用API​​確定是否首先需要紋理。這是開始爲着色器變量命名約定開始關注的地方,因此可以使多個着色器與相同的C++代碼兼容。

常量緩衝區(或D3D9中的原始着色器常量)非常複雜,特別是在像Unreal這樣的引擎中可以找到可編程着色器框架時。任何給定着色器使用的常量都是完整列表的一個子集,但通常必須將C++端寫入,就好像它們都是需要的。需要再次使用反射API來確定哪些變量實際上在着色器中被引用,以及它們的位置。這在D3D10中變得更容易管理,因爲cbuffers是結構體而且比D3D9系統更加流暢,而這個系統受寄存器數量的嚴格限制,但它也增加了也需要使用反射API來確定cbuffer的順序的步驟綁定(以及哪些緩衝區本身也被引用)。

到底有一個設計,使這一切工作:

使驅動特定着色器原型的類。對於這個類暴露給着色器(無論是紋理,常量緩衝區等)的每個變量,在反射信息中查找是否使用了它,並找出它的位置並進行設置。保持這種快速,靈活和可擴展性是一項艱鉅的挑戰。

+0

「,但它也增加了也需要使用反射API來確定cbuffer綁定順序(以及哪些cbuffers本身也被引用)的步驟。」 - 爲什麼不使用相關的緩衝區偏移量,例如,如果您已經使用相關的t0,t1等加載了ShaderResourceView,則會按照您將資源設置爲着色器的順序引用它們。 – Jay 2011-06-28 10:01:52