一、着色加載
這里說的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} }; |
-----------------------------------------------------------------------------------------------------------------------
