HLSL語言基礎

有的時候我們在使用UE4 的時候,需要設計出別樣的Shader,往往UE4內部的材質無法滿足,這個時候,就需要我們手寫Shader,了解HLSL就至關重要,現在我們總結一下HLSL語言基礎:


變數類型

標量類型

bool ,int ,float,double基本上可C++差不多,所以不再這裡講解;

half:16位的浮點數

向量類型

float2 ,2D向量,內部存儲著兩個浮點類型 float

float3 ,3D向量,內部存儲著三個浮點類型 float

float4 ,4D向量,內部存儲著四個浮點類型 float

除此之外還有:

int2 ,2D整數,內部存儲著兩個類型 int

int3 ,3D整數,內部存儲著三個類型 int

int4 ,4D整數,內部存儲著四個類型 int

除此之外還有:

bool2 ,2Dbool,內部存儲著兩個類型 bool

bool3 ,3Dbool,內部存儲著三個類型 bool

bool4,4Dbool,內部存儲著四個類型 bool

...

TypeN (2<=N<=4)

...

向量初始化

float3 v = {1.0f, 2.0f, 3.0f};

float2 w = float2(x, y);//內部支持聯等

float4 u = float4(w, 3.0f, 4.0f); // u= (w.x, w.y, 3.0f, 4.0f)

向量的訪問

用數組語法:

如:pos[i] = 3.14f;

用字母語法,xyzw,rgba。

如:

pos.x = pos.r = 1.0f;

pos.y = pos.g = 2.0f;

pos.z = pos.b = 3.0f;

pos.w = pos.a = 4.0f;

向量的替換調配

float2 pos = {x,y};

float3 pos = {x,y,z};

float4 pos = {x,y,z,w};

例如

float4 UV1 = {0.1f, 0.2f, 0.3f, 0.4f};

float4 UV2 = {0.0f, 0.0f, 0.0f, 0.0f};

UV2 = UV1 .wyyx; // v = {0.4f, 0.2f, 0.2f,0.10=f}

UV2 = UV1 .wzyx; // v = {0.4f, 0.3f, 0.2f,0.1f}

UV2.xy = u; // v = {0.1f,0.2f, 0.0f,0.0f}

矩陣類型

矩陣定義

語法:Typexn xxx例如:

float2x2:2x2的矩陣,類型是float;

half3x3:3x3矩陣類型是half

int4x4: 4 × 4 矩陣類型是int

bool3x4: 3 × 4 矩陣類型是bool

矩陣訪問

矩陣的數組語法:M[i][j] = value;

M._11 = M._12 = M._13 = M._14 = 0.1f;

M._21 = M._22 = M._23 = M._24 = 0.2f;

M._31 = M._32 = M._33 = M._34 = 0.3f;

M._41 = M._42 = M._43 = M._44 = 0.4f;

or

M._m00 = M._m01 = M._m02 = M._m03 =0.5f;

M._m10 = M._m11 = M._m12 = M._m13 =0.6f;

M._m20 = M._m21 = M._m22 = M._m23 =0.7f;

M._m30 = M._m31 = M._m32 = M._m33 =0.8f;

矩陣初始化

float2x2 Mat =float2x2(1.0f,2.0f,3.0f,4.0f);

int2x2 Mat ={1,2,3,4};

矩陣賦值

float3 Nor = normalize(pIn.normalW);

float3 Tan = normalize(pIn.tangentW -dot(pIn.tangentW, N)*N);//固定寫法

float3 B = cross(Nor ,Tan );

float3x3 NTB;

NTB[0] = Nor ; // float3

NTB[1] =Tan ; // float3

NTB[2] = B; // float3

其他定義

vector u = {1.0f, 2.0f, 3.0f, 4.0f};

matrix M; // 4x4 矩陣

數組

float C[8][7];

half t[n];

int3 v[42];//42個int3

結構體

HLSL中的結構體類似C中的結構體,不能含有函數成員,訪問成員只需要根據下標即可。

struct TastShader

{

float3 normal;

float3 postion;

float4 diffuse;

float4 spec;

};

TastShader T;

litColor += T.diffuse;

dot(lightVec, T.normal);

float specPower = max(T.spec.a, 1.0f);

和變數相關的關鍵字

typedef,static,uniform,extern,const,shared;

typedef:

HLSL的typedef關鍵字功能和C++里的完全一樣。例如,我們可以給類型vector<float, 3>

typedef vector<float, 3> point;

typedef const float CFLOAT;

typedef float point2[2];

用下面的語法命名:

static:

變數默認是extern 外部可見。一旦聲明了static後變數就是內部變數,不會暴露在著色器外面

uniform:

uniform——如果變數以uniform關鍵字為前綴,就意味著此變數在著色器外面被初始化,比如被C++應用程序初始化,然後再輸入進著色器。

extern:

extern——如果變數以extern關鍵字為前綴,就意味著該變數可在著色器外被訪問,比如被C++應用程序。僅全局變數可以以extern關鍵字為前綴。不是static的全局變數默認就是extern。

shared:

shared——如果變數以shared關鍵字為前綴,就提示效果框架:變數將在多個效果間被共享。僅全局變數可以以shared為前綴。

volatile:

volatile——如果變數以volatile關鍵字為前綴,就提示效果框架:變數將時常被修改。僅全局變數可以以volatile為前綴

const:

const——HLSL中的const關鍵字和C++里的意思一樣。也就是說,如果變數以const為前綴,那此變數就是常量,並且不能被改變。

著色器關聯

頂點和像素著色器提供的數據供其後的圖形管線使用.輸出關聯用於指定著色器產生的數據如何鏈接給下一階段的輸入.舉例來說,頂點著色器的輸出關聯將頂點著色程序運算得到的結果鏈接到像素著色器的輸入關聯上.

頂點著色器輸出關聯用於將著色器連接到像素著色器和光柵階段.POSITION輸出是每個頂點必須輸出給光柵器而不暴露給像素著色器的數據,

TEXCOORDn和COLORn表示輸出用於像素著色器進行插值.

像素著色器輸出關聯將其輸出顏色綁定給正確的渲染目標.顏色輸出被連接到alpha混合階段.DEPTH輸出關聯用於改變當前光柵化位置的目標深度值.輸出關聯語義同輸入關聯的聲明相同.

頂點著色器的輸入關聯

關聯符 描述

POSITIONn 位置

BLENDWEIGHTn 混合寬

BLENDINDICESn 混合索引

NORMALn 標準向量

PSIZEn 點大小

COLORn 顏色

TEXCOORDn 紋理坐標

TANGENTn 切線

BINORMALn 副法線

TESSFACTORn 細分因子

像素著色器輸入關聯

關聯符 描述

COLORn 顏色

TEXCOORDn 紋理坐標

注意:n是一個可選的整形變數

其他教程地址

人宅:人宅系列教程目錄?

zhuanlan.zhihu.com圖標
推薦閱讀:

TAG:shader | 虛幻4(遊戲引擎) | 遊戲引擎 |