簡體   English   中英

加載和使用 HLSL 着色器?

[英]Loading and using an HLSL shader?

我一直在尋找所有我能找到的關於編寫着色器的教程。 他們都沒有向我展示如何將它們合並到我的場景中。

所以本質上:

給定一個 hlsl 着色器,如果我有一個名為 drawTexturedQuad() 的 function 並且我希望將着色器應用於結果,我該怎么做呢?

謝謝

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

只是一個附加說明 - 如果有疑問,請詢問MSDN

這個問題的答案出奇地復雜,並且隨着 GPU 硬件變得越來越強大而變得越來越困難。 D3DX FX 系統是所有需要完成的工作的一個例子,因此使用它是一個很好的步驟,可以讓事情為短期使用而工作。

着色器是代碼,但它們存在於 CPU 的另一台機器上,因此需要對它們的所有數據進行編組。 固定部分:基本渲染狀態,如深度狀態、模板狀態、混合模式、繪圖命令; 非常容易實現。 困難的部分是為可編程部分搭建橋梁:着色器、緩沖區、采樣器和紋理。

索引緩沖區只是工作,因為在渲染未索引幾何體的情況下你只能有一個,或者沒有。

頂點緩沖區或多或少相當容易處理,因為可以對硬件進行編程以按程序讀取頂點緩沖區。 您的頂點緩沖區只需要提供至少與頂點着色器想要訪問的信息一樣多的信息。 修改着色器的頂點輸入,或需要同時編輯兩側的頂點格式,因此相當容易使用。

采樣器和紋理是下一個“更容易”掛鈎的難點:它們有一個變量名和一個相當嚴格的類型。 例如,在編譯着色器“foo”時,紋理“myNormalMap”被分配紋理槽 3。您需要(通過反射 API)查找紋理被分配的槽,並將引擎認為“myNormalMap”的紋理設置為在運行時到插槽 3,當然也使用 API 來確定是否首先需要紋理。 這就是着色器變量的命名約定開始變得重要的地方,因此可以使多個着色器與相同的 C++ 代碼兼容。

常量緩沖區(或 D3D9 中的原始着色器常量)要復雜得多,尤其是對於像 Unreal 這樣的引擎中可以找到的可編程着色器框架。 任何給定着色器使用的常量都是完整列表的子集,但 C++ 端通常必須像所有這些都需要一樣編寫。 反射 API 不僅需要確定着色器中實際引用了哪些變量,還需要確定它們所在的位置。 這在 D3D10 和更新版本中變得更易於管理,因為 cbuffer 是結構體並且比 D3D9 系統流動性差,后者受到寄存器數量的嚴重限制,但它也增加了還需要使用反射 API 來確定 cbuffer 順序的步驟綁定(以及哪些 cbuffers 本身也被引用)。

最后,有一種設計可以使一切正常工作:

制作一個驅動特定着色器原型的 class。 對於這個 class 暴露給着色器(可能是紋理、常量緩沖區等)的每個變量,在反射信息中查找它是否被使用,並找出它的位置並設置它。 保持這種快速、靈活和可擴展是一項艱巨的挑戰。

暫無
暫無

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

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