DX11渲染管道 著色器的編譯和建立

2021-09-01 14:45:02 字數 1706 閱讀 2229

在不使用效果框架的時候,整個渲染管道其實挺簡單的,建立資源,輸入資源。編譯著色器輸入著色器,其實著色器本身也是一種資料,只不過這個資料描述的是邏輯。最後呼叫一下draw方法畫一下就ok 了。這裡說說著色器的編譯和建立,很簡單。

d3dx11compilefromfile :

hresult d3dx11compilefromfile(

_in_ lpctstr psrcfile, // 檔案路徑

_in_ const d3d10_shader_macro *pdefines, // 可選,乙個鍵值對陣列,直接設定為null

_in_ lpd3d10include pinclude, // 可選,這個相當於c++的include命令也是乙個陣列。

_in_ lpcstr pfunctionname, // 入口方法的名字

_in_ lpcstr pprofile, // vs_5_0

_in_ uint flags1, // 著色器編譯標誌。

_in_ uint flags2, // 效果編譯標誌。

_in_ id3dx11threadpump *ppump, // 執行緒?

_out_ id3d10blob **ppshader, // 編譯後的結果

_out_ id3d10blob **pperrormsgs, // 編譯後的錯誤資訊

_out_ hresult *phresult

);

著色器編譯標誌

createvertexshader :

hresult createvertexshader(

[in] const void *pshaderbytecode, // id3d10blob 編譯結果

[in] size_t bytecodelength, // id3d10blob 的size

[in] id3d11classlinkage *pclasslinkage, // id3d10blob 使用到的外部class,連線的陣列

[out] id3d11vertexshader **ppvertexshader // 結果

);

其他的著色器也就這樣。

例子:

id3d10blob* errormessage = nullptr;

id3d10blob* vertexshaderbuffer;

id3d11vertexshader* vertexshader;

wchar* wfilename = stringutil::stringtowchar(filename);

// 編譯vs**.

d3dx11compilefromfile(wfilename, null, null, "colorvertexshader", "vs_5_0", d3d10_shader_enable_strictness, 0, null,

&vertexshaderbuffer, &errormessage, null);

// 從緩衝建立vs shader.

result = pd3ddevice->createvertexshader(vertexshaderbuffer->getbufferpointer(), vertexshaderbuffer->getbuffersize(), null, &vertexshader);

DX11渲染管道 資料的修改 Map和Unmap

在c 與hlsl繫結cbuffer資料的時候,非常容易出錯,出錯的根本原因是c 對資料結構記憶體的分配與hlsl不同。重要 hlsl的結構體struct其實並不管你是乙個變數還是幾個變數,它就是按照一次放滿乙個float4的記憶體長度,多少變數都往乙個float4裡面塞,塞滿了再接著塞下乙個floa...

DX12 混合和幾何著色器

第十章及第十二章 混合兩步即可實現 首先建立乙個pipeline stage d3d12 graphics pipeline state desc transparentpsodesc opaquepsodesc d3d12 render target blend desc transparency...

Unity著色器基礎 標籤和渲染狀態

前言 一開始入門寫著色器的時候主要關注於頂點著色器和片元著色器裡的內容,可後來發現總是會在標籤和渲染狀態設定時掉進坑里,這裡就索性參考官方文件以及其它前輩的部落格好好整理一下。subshader中定義了一系列pass以及可選的狀態 rendersetup和標籤設定 tags。每個pass定義了一次完...