著色器中的參數(shù)
從應(yīng)用階段傳遞模型數(shù)據(jù)給頂點(diǎn)著色器時(shí) 常用的語義
命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?實(shí)例? ? ? ? ? ? ? ? ? ? ? ? ?說明
POSITION? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?模型空間中的頂點(diǎn)位置,一般是float4類型
NORMAL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?頂點(diǎn)法線,float3類型
TANGENT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?頂點(diǎn)切線 float4
TEXCOORD0~N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?該頂點(diǎn)紋理坐標(biāo),0是第一組,一般是flkoat2 或float4類型
COLOR? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?頂點(diǎn)顏色,通常是fixed4或float4類型
unity 內(nèi)置的矩陣變換
命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說明
UNITY_MATRIX_MVP? ? ? ? ?當(dāng)前的模型觀察投影矩陣,用于將頂點(diǎn)/方向矢量從模型空間變換到裁剪空間
UNITY_MATRIX_MV? ? ? ? ? ? 當(dāng)前的模型觀察矩陣,用于將頂點(diǎn)/方向矢量從模型空間變換到觀察空間
UNITY_MATRIX_V? ? ? ? ? ? ? ?當(dāng)前的觀察矩陣,用于將頂點(diǎn)/方向矢量從世界空間變換到觀察空間
UNITY_MATRIX_P? ? ? ? ? ? ? ?當(dāng)前的投影矩陣,用于將頂點(diǎn)/方向矢量從觀察空間變換到裁剪空間
UNITY_MATRIX_VP? ? ? ? ? ? ?當(dāng)前的觀察投影矩陣,用于將頂點(diǎn)/方向矢量從世界空間變換到裁剪空間
UNITY_MATRIX_T_MV? ? ? ? UNITY_MATRIX_MV 的轉(zhuǎn)置矩陣
UNITY_MATRIX_IT_MV? ? ? ?UNITY_MATRIX_MV的逆轉(zhuǎn)置矩陣,用于將法線從模型空間變換到觀察空間,也可以用于得到UNITY_MATRIX_MV的逆矩陣
_Object2World? ? ? ? ? ? ? ? ? ? ? 當(dāng)前的模型矩陣,用于將頂點(diǎn)/方向矢量從模型空間變換到世界空間
_World2Object? ? ? ? ? ? ? ? ? ? ? _Object2World的逆轉(zhuǎn)矩陣,用于將頂點(diǎn)/方向矢量從世界空間變換到模型空間
unity 頂點(diǎn)轉(zhuǎn)換函數(shù)
命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說明
float4 UnityObjectToClipPos(float3 pos)? ? ? ? ? ? 將一個(gè)點(diǎn)從object空間轉(zhuǎn)換成相機(jī)在均勻坐標(biāo)下的剪輯空間。這就相當(dāng)于 mul(UNITY_MATRIX_MVP, float4(pos, 1.0)), 應(yīng)該在它的位置上使用。
float3 UnityObjectToViewPos(float3 pos)? ? ? ? ? ?將一個(gè)點(diǎn)從object空間轉(zhuǎn)換為view空間。這就相當(dāng)于mul(UNITY_MATRIX_MV, float4(pos, 1.0)).xyz, 應(yīng)該在它的位置上使用。
unity 內(nèi)置的攝像機(jī)和屏幕參數(shù)
命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?說明
float3 _WorldSpaceCameraPos? ? ? ? ? ?該攝像機(jī)在世界空間中的位置
float4 _ProjectionParams? ? ? ? ? ? ? ? ? ? ?x=1.0 或-1.0(使用反轉(zhuǎn)的投影矩陣渲染時(shí)是負(fù)數(shù)),y=Near,z=Far,w= 1.0+1.0/Far, 其中near和far分別是近裁剪平面和遠(yuǎn)裁剪平面與攝像機(jī)的距離
float4 _ScreenParams? ? ? ? ? ? ? ? ? ? ? ? ? x=width,y=height,z=1.0+1.0/width,w=1.0+1.0/height, 其中width和height分別是該攝像機(jī)的渲染目標(biāo) (render target)的像素寬度和高度
float4 _ZBufferParams? ? ? ? ? ? ? ? ? ? ? ? ?x=1-Far/near,yFar/Near, 最x/Far,wy/Far,該變量用于線性化Z緩存中的深度值
floart4 unity_OrhoParams? ? ? ? ? ? ? ? ? ? x=width,y=height,z無意義,w=1.0(該相機(jī)是正交相機(jī))或w=0.0(透視相機(jī)),其中width和height是正交投影相機(jī)的寬和高
float4x4 unity_CameraProjection? ? ? ? 該攝像機(jī)的投影矩陣
floart4x4 unity_CameraInvProjection? 該攝像機(jī)的投影矩陣的逆矩陣
float4 unity_CameraWorldClipPlanes 該攝像機(jī)的6個(gè)裁剪屏幕在世界空間下的等式,按左右上下近遠(yuǎn)的順序裁剪平面
UnityCG.cginc 庫
UnityCG.cginc 該文件中包含了很多即成的參數(shù)方法。使用十分方便
引入文件
CGPROGRAM
#include "UnityCG.cginc"
ENDCG
unitycg.cginc 常用結(jié)構(gòu)
命令 參數(shù) 實(shí)例 說明
appdata_base? ? ? ? 頂點(diǎn)位置、頂點(diǎn)法線、第一組紋理坐標(biāo)? ? ? float4 vertex : POSITION; float3 normal : NORMAL; float4 texcoord: TEXCOORD0; 可用于頂點(diǎn)著色器的輸入
appdata_tan? ? ? ? ? ?頂點(diǎn)位置、頂點(diǎn)切線、頂點(diǎn)法線、第一組紋理坐標(biāo)? ? ? ? ?float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; 可用于頂點(diǎn)著色器的輸入
appdata_full? ? ? ? ? 頂點(diǎn)位置、頂點(diǎn)切線、頂點(diǎn)法線、四組(或更多)紋理坐標(biāo)? ? ? float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; float4 texcoord1 : TEXCOORD1; float4 texcoord2 : TEXCOORD2; float4 texcoord3 : TEXCOORD3; #if defined(SHADER_API_XBOX360) half4 texcoord4 : TEXCOORD4; half4 texcoord5 : TEXCOORD5; #endif fixed4 color : COLOR; 可用于頂點(diǎn)著色器的輸入
appdata_img? ? ? ? ? 可用于頂點(diǎn)著色器的輸入? ? ? ? ? float4 vertex : POSITION; half2 texcoord : TEXCOORD0; 可用于頂點(diǎn)著色器的輸入
v2f_img? ? ? ? ? ? ? ? ? ?裁剪空間中的位置、紋理坐標(biāo) 可用于頂點(diǎn)著色器的輸出
unitycg.cginc 常用函數(shù)
命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說明
float4 WorldSpaceViewDir(float4 v)? ? ? ? ? ? ? ?輸入一個(gè)模型空間中的頂點(diǎn)位置,返回世界空間中從該點(diǎn)到攝像機(jī)的觀察方向
float4 UnityWorldSpaceViewDir(float4 v)? ? ? ?輸入一個(gè)世界空間中的頂點(diǎn)位置,返回世界空間中從該點(diǎn)到攝像機(jī)的觀察方向
float4 ObjSpaceViewDir(float4 v)? ? ? ? ? ? ? ? ? ?輸入一個(gè)模型空間中的頂點(diǎn)位置,返回模型空間中從該店到攝像機(jī)的觀察方向
float4 WorldSpace LightDir(flaot4 v)? ? ? ? ? ? ? 僅用于向前渲染。 輸入一個(gè)模型空間中的頂點(diǎn)位置,返回世界空間中從該點(diǎn)到光源的光照方向。沒有被歸一化
float4 ObjectSpaceLightDir(float4 v)? ? ? ? ? ? ? 僅用于向前渲染中,輸入一個(gè)模型空間中的頂點(diǎn)位置, 返回模型空間中從該點(diǎn)到光源的光照方向。沒有被歸一化
float4 UnityWorldSpaceLightDir(float4 v)? ? ? ? 僅用于向前渲染中,輸入一個(gè)世界空間中的頂點(diǎn)位置, 返回世界空間中從該點(diǎn)到光源的光照方向。沒有被歸一化
float3 UnityObjectToWorldNormal(float3 norm)? ? ? ? ? ?把法線方向從模型空間中轉(zhuǎn)換到世界空間中
float3 UnityObjectToWorldDir(float3 dir)? ? ? ? ? ?把方向矢量從模型空間中變換到世界空間中
float3 Unity WorldToObjectDir(float3 dir)? ? ? ? ? 把方向矢量從世界空間變換到模型空間中
shader數(shù)學(xué)函數(shù)
函數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?說明?
radians(degree)? ? ? ? ? ? ? ? ? ? 角度變弧度(一般默認(rèn)都用弧度)
degrees(radian)? ? ? ? ? ? ? ? ? ? 弧度變角度
sin(angle)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?三角函數(shù)
cos(angle)? ? ? ? ? ? ? ? ? ? ? ? ? ? 三角函數(shù)
tan(angle)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?三角函數(shù)
asin(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arc sine, 返回弧度 [-PI/2, PI/2];
acos(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arc cosine,返回弧度 [0, PI]
atan(y, x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arc tangent, 返回弧度 [-PI, PI];
atan(y/x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arc tangent, 返回弧度 [-PI/2, PI/2];
pow(x, y)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?x的y次方
exp(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?指數(shù), log(x)
exp2(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2的x次方, log2(x)
sqrt(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? x的根號(hào);
inversesqrt(x)? ? ? ? ? ? ? ? ? ? ? x根號(hào)的倒數(shù)
abs(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 絕對(duì)值
sign(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?取當(dāng)前數(shù)值的正負(fù)符號(hào),返回 1, 0 或 -1 (x>0;x=0;x<0)
floor(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?底部取整
ceil(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 頂部取整
fract(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?取小數(shù)部分
mod(x, y)? ? ? ? ? ? ? ? ? ? ? ? ? ? 取模, x - y*floor(x/y)
min(x, y)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?取最小值
max(x, y)? ? ? ? ? ? ? ? ? ? ? ? ? ? 取最大值
clamp(x, min, max)? ? ? ? ? ? min(max(x, min), max);
mix(x, y, a)? ? ? ? ? ? ? ? ? ? ? ? ?x, y的線性混疊, x(1-a) + y*a;
step(edge, x)? ? ? ? ? ? ? ? ? ? 如 x smoothstep(edge0, edge1, x): threshod smooth transition時(shí)使用。 x<=edge0時(shí)為0.0, x>=edge1時(shí)為1.0
length(x)? ? ? ? ? ? ? ? ? ? ? ? ? ?向量長(zhǎng)度
distance(p0, p1)? ? ? ? ? ? ? ?兩點(diǎn)距離, length(p0-p1);
dot(x, y)? ? ? ? ? ? ? ? ? ? ? ? ? ? 點(diǎn)積,各分量分別相乘 后 相加
cross(x, y)? ? ? ? ? ? ? ? ? ? ? ? 差積 x[1]*y[2]-y[1]*x[2], x[2]*y[0] - y[2]*x[0], x[0]*y[1] - y[0]*x[1]
normalize(x)? ? ? ? ? ? ? ? ? ? ?歸一化 length(x)=1;
faceforward(N, I, Nref)? ? ?如 dot(Nref, I)< 0則N, 否則 -N
reflect(I, N)? ? ? ? ? ? ? ? ? ? ? I的反射方向 I -2*dot(N, I)*N, N必須先歸一化
refract(I, N, eta)? ? ? ? ? ? ? ?折射 k=1.0-etaeta(1.0 - dot(N, I) * dot(N, I)); 如k<0.0 則0.0,否則 etaI - (etadot(N, I)+sqrt(k))*N
matrixCompMult(matX, matY)? ? ? ? ? ? ? ?矩陣相乘, 每個(gè)分量 自行相乘 r[j] = x[j]*y[j];
lessThan(vecX, vecY)? ? ? ? ? ? ? ?向量 每個(gè)分量比較 x < y
lessThanEqual(vecX, vecY)? ? ?向量 每個(gè)分量比較 x<=y
greaterThan(vecX, vecY)? ? ? ? ?向量 每個(gè)分量比較 x>y
greaterThanEqual(vecX, vecY) 向量 每個(gè)分量比較 x>=y
equal(vecX, vecY)? ? ? ? ? ? ? ? ? ?向量 每個(gè)分量比較 x==y
notEqual(vecX, vexY)? ? ? ? ? ? ? 向量 每個(gè)分量比較 x!=y
any(bvecX)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 只要有一個(gè)分量是true, 則true
all(bvecX)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 所有分量是true, 則true
not(bvecX)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?所有分量取反
ShaderlabVS? ? ? ? ? ? ? ? ? https://marketplace.visualstudio.com/items?itemName=ShaderlabVS2019.ShaderlabVS
ShaderlabVSCode? ? ? ? ?https://marketplace.visualstudio.com/items?itemName=amlovey.shaderlabvscodefree#overview
HLSL Tools for Visual Studio? ? ??https://marketplace.visualstudio.com/items?itemName=TimGJones.HLSLToolsforVisualStudio