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整數,內部存儲著兩個類型 intint3 ,3D整數,內部存儲著三個類型 intint4 ,4D整數,內部存儲著四個類型 int除此之外還有:bool2 ,2Dbool,內部存儲著兩個類型 boolbool3 ,3Dbool,內部存儲著三個類型 boolbool4,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矩陣類型是halfint4x4: 4 × 4 矩陣類型是intbool3x4: 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;orM._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 ; // float3NTB[1] =Tan ; // float3NTB[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
推薦閱讀: