著色器語言:變量類型
介紹:著色器語言和C,C++編程語言一樣
-
為什么存在和簡單介紹:
- 先了解到有兩種渲染管線
-
固定渲染管線
- 是可配置的管線
- 要不同效果時需要打開不同開關組合成不同效果
- 弊端
- 需要搭配各種開關
-
可編程渲染管線
將很多可配置開關改為編程實現
通過編程實現各種效果
-
可編程那么久需要編程語言
-
GPU提供一整套匯編指令集進行編程
- MSDN中可以看到部分指令集
- 比如矩陣乘法、賦值MOV等等
- MSDN中可以看到部分指令集
-
問題是匯編難度大
-
于是出現兩種語法類似的高級著色器語言:都是類C的,編程最終編譯成對應匯編指令集
- DX:HLSL
- MSDN上
- OpenGL:GLSL
- WiKi
- DX:HLSL
-
-
-
- 先了解到有兩種渲染管線
語法介紹
-
標量
bool # true | false
int #32位有符號整數
-
half #16位浮點數(float一半)
- unity中有改名定義為fixed
float #32位浮點數
double #64位浮點數
unity中
fixed a = 1;
-
可以看到有
#include "UnityCG.cginc"
-
shader根據不同平臺分配別名
C:\Program Files\Unity\Editor\Data\CGIncludes\HLSLSupport.cginc
-
依次在安裝目錄找到 引入的文件并找到根文件可以看到 定義別名(為的是跨平臺管理)
可以看到在有些平臺把half等改名成了fixed
-
向量類型
float2 #2D向量
float3#3D向量
-
float4 #4D向量
float4 a = float4(1,2,3,4)
-
復合分置:獲得分量
float4 u = {1.0f, 2.0f, 3.0f, 4.0f}
u.xyzw
u.wyyz
u.zzxy
-
再如獲取rgb值
fixed4 c = ....; fixed4 o = ...; o.Albedo = c.rgb;
-
也可以直接作為返回
fixed frag(v2f i):..{ fixed4 col = tex2D(_MainTex, i.uv); return col.gbar; } //等價于 fixed ret = fixed4(col.g, col.b, col.a, col.r); return ret;
-
矩陣類型
- float2x2 #2x2矩陣 有些平臺有可能稱為mat2
- float3x3 #3x3矩陣 mat3
- float4x4 #4x4矩陣 mat4
-
數組
- float m[4]
- half a[2]
- float3 v[12]
-
結構體
結構體的定義方法跟C/C++完全一樣。但是結構體不能包含函數。
//代表輸入數據 struct Input { float3 pos; float3 normal; float2 uvO; float2 uvl; }
-
typedef關鍵字(#define)
typedef與C/C++功能一樣。即給某個類型指定一個別名
-
typedef
typedef float2 point; //float指定為point float2 pos = point pos
- 使用C程序做個范例
#include <stdio.h> int main(int argc, const char * argv[]) { typedef int wwnje; wwnje i= 233; int j = 322; printf("%d, %d", i, j); return 0; }
-
(#define)宏定義,使用定義的字符串替換名稱
-
使用C程序做個范例
#include <stdio.h> #define wwnje int int main(int argc, const char * argv[]) { wwnje i= 233; int j = 322; printf("%d, %d", i, j); return 0; }
-
-
-
變置修飾符
- static #靜態類型,程序無法訪向這個變量
- uniform #常置,程序指定一個值,在著色器中不會在發生變化,也無法改變
- const #常量
-
類型轉換
-
在高級著色器里轉換機制非常炅活
float3 n = fioat3(1, 0,0) ; float3 v = 2.0f * n - 1.0f;
-
也可以同時使用組合分量
float3 n = fioat3(1, 0,0) ; float3 v = 2.0f * n.xyz - 1.0f;
?
?
-