1. 程式人生 > >(原)Unreal Shader模塊(一): 著色創建

(原)Unreal Shader模塊(一): 著色創建

位置 步驟 初始化 編譯 .cpp top red col 堆棧

一、著色加載

這裏說的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結構體中的語義名相同,若有多個相同的語義名,則語義索引就是另外一種區分

2DXGI_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模塊(一): 著色創建