(原)Unreal Shader模塊(一): 著色創建
一、著色加載
這裏說的Shader是編譯後的文件或內存
源碼說明
----------------------------------------------------------------------------------------------------------------------
D3D11Shaders.cpp | RHI層級 | 封裝DX,調用相關指令創建相關著色器,並且綁定布局(頂點布局) |
|
|
|
|
|
|
|
|
|
|
|
|
下文均用DX說明
源碼 | :Engine\Source\Runtime\ShaderCore\ :Engine\Source\Runtime\Windows :Engine\Source\Runtime\Renderer\(只是上級) |
調用堆棧
這裏比較重要的是:
RenderModule,,,
DeferredShadingSceneRender,,,
ShaderRources,,,
DrawingPolicy(此設計方法值得學習)
相關類圖
1、基礎
2、紋理
。。。。(待)
頂點著色器
娓娓道來:
大體上需要三個步驟
1、創建和初始化ShaderReader
2、創建個新的頂點著色,數據格式
3、shader數據選項賦予
ReadShaderOptionalData
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
DXAPI 回顧
----------------------------------------------------------------------------------------------------------------------
創建Shader
HRESULT ID3D11Device::CreateVertexShader
(
const void * | pShaderBytecode, | // [In]著色器字節碼 |
SIZE_T | BytecodeLength, | // [In]字節碼長度 |
ID3D11ClassLinkage * | pClassLinkage, | // [In_Opt]忽略 |
ID3D11VertexShader ** | ppVertexShader | // [Out]獲取頂點著色器 |
);
類似的有
方法 | 著色器 | 類型描述 |
ID3D11Device::CreateVertexShader | ID3D11VertexShader | 頂點著色器 |
ID3D11Device::CreateHullShader | ID3D11HullShader | 外殼著色器 |
ID3D11Device::CreateDomainShader | ID3D11DomainShader | 域著色器 |
ID3D11Device::CreateComputeShader | ID3D11ComputeShader | 計算著色器 |
ID3D11Device::CreateGeometryShader | ID3D11GeometryShader | 幾何著色器 |
ID3D11Device::CreatePixelShader | ID3D11PixelShader | 像素著色器 |
頂點輸入布局:
HRESULT ID3D11Device::CreateInputLayout
(
const D3D11_INPUT_ELEMENT_DESC * | pInputElementDescs | // [In]輸入布局描述 |
UINT | NumElements | // [In]上述數組元素個數 |
const void * | pShaderBytecodeWithInputSignature | // [In]頂點著色器字節碼 |
SIZE_T | BytecodeLength | // [In]頂點著色器字節碼長度 |
ID3D11InputLayout ** | ppInputLayout); | // [Out]獲取的輸入布局 |
);
typedef struct D3D11_INPUT_ELEMENT_DESC
{
LPCSTR | SemanticName; | // 語義名 |
UINT | SemanticIndex; | // 語義索引 |
DXGI_FORMAT | Format; | // 數據格式 |
UINT | InputSlot; | // 輸入槽索引(0-15) |
UINT | AlignedByteOffset; | // 初始位置(字節偏移量) |
D3D11_INPUT_CLASSIFICATION | InputSlotClass; | // 輸入類型 |
UINT | InstanceDataStepRate; | // 忽略 |
}
說明:
1、語義名要與HLSL結構體中的語義名相同,若有多個相同的語義名,則語義索引就是另外一種區分
2、DXGI_FORMAT在這裏通常描述數據的存儲方式、大小
3、初始位置則指的是該成員的位置與起始成員所在的字節偏移量
4、輸入類型有兩種:D3D11_INPUT_PER_VERTEX_DATA為按每個頂點數據輸入,D3D11_INPUT_PER_INSTANCE_DATA則是按每個實例數據輸入
HRESULT ID3D11Device::CreateInputLayout(
const D3D11_INPUT_ELEMENT_DESC * | pInputElementDescs, | // [In]輸入布局描述 |
UINT | NumElements, | // [In]上述數組元素個數 |
const void * | pShaderBytecodeWithInputSignature, | // [In]頂點著色器字節碼 |
SIZE_T | BytecodeLength, | // [In]頂點著色器字節碼長度 |
ID3D11InputLayout ** | ppInputLayout | // [Out]獲取的輸入布局例如 |
);
一個例子
HLSL: struct VertexIn { float3 pos : POSITION; float4 color : COLOR; };
C++結構: struct VertexPosColor { DirectX::XMFLOAT3 pos; DirectX::XMFLOAT4 color; static const D3D11_INPUT_ELEMENT_DESC inputLayout[2]; // Static不占struct };
布局: const D3D11_INPUT_ELEMENT_DESC VertexPosColor::inputLayout[2] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0} }; |
-----------------------------------------------------------------------------------------------------------------------
(原)Unreal Shader模塊(一): 著色創建