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

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}

};

-----------------------------------------------------------------------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM