著色器語言:變量類型
介紹:著色器語言和C萍膛,C++編程語言一樣
-
為什么存在和簡單介紹:
- 先了解到有兩種渲染管線
-
固定渲染管線
- 是可配置的管線
- 要不同效果時需要打開不同開關(guān)組合成不同效果
- 弊端
- 需要搭配各種開關(guān)
-
可編程渲染管線
將很多可配置開關(guān)改為編程實(shí)現(xiàn)
通過編程實(shí)現(xiàn)各種效果
-
可編程那么久需要編程語言
-
GPU提供一整套匯編指令集進(jìn)行編程
- MSDN中可以看到部分指令集
- 比如矩陣乘法躯护、賦值MOV等等
- MSDN中可以看到部分指令集
-
問題是匯編難度大
-
于是出現(xiàn)兩種語法類似的高級著色器語言:都是類C的,編程最終編譯成對應(yīng)匯編指令集
- DX:HLSL
- MSDN上
- OpenGL:GLSL
- WiKi
- DX:HLSL
-
-
-
- 先了解到有兩種渲染管線
語法介紹
-
標(biāo)量
bool # true | false
int #32位有符號整數(shù)
-
half #16位浮點(diǎn)數(shù)(float一半)
- unity中有改名定義為fixed
float #32位浮點(diǎn)數(shù)
double #64位浮點(diǎn)數(shù)
unity中
fixed a = 1;
-
可以看到有
#include "UnityCG.cginc"
-
shader根據(jù)不同平臺分配別名
C:\Program Files\Unity\Editor\Data\CGIncludes\HLSLSupport.cginc
-
依次在安裝目錄找到 引入的文件并找到根文件可以看到 定義別名(為的是跨平臺管理)
可以看到在有些平臺把half等改名成了fixed
-
向量類型
float2 #2D向量
float3#3D向量
-
float4 #4D向量
float4 a = float4(1,2,3,4)
-
復(fù)合分置:獲得分量
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
-
數(shù)組
- float m[4]
- half a[2]
- float3 v[12]
-
結(jié)構(gòu)體
結(jié)構(gòu)體的定義方法跟C/C++完全一樣屑墨。但是結(jié)構(gòu)體不能包含函數(shù)躁锁。
//代表輸入數(shù)據(jù) struct Input { float3 pos; float3 normal; float2 uvO; float2 uvl; }
-
typedef關(guān)鍵字(#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 #靜態(tài)類型卵史,程序無法訪向這個變量
- uniform #常置战转,程序指定一個值,在著色器中不會在發(fā)生變化以躯,也無法改變
- const #常量
-
類型轉(zhuǎn)換
-
在高級著色器里轉(zhuǎn)換機(jī)制非常炅活
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;
?
?
-