着色器中的参数
从应用阶段传递模型数据给顶点着色器时 常用的语义
命令 实例 说明
POSITION 模型空间中的顶点位置,一般是float4类型
NORMAL 顶点法线,float3类型
TANGENT 顶点切线 float4
TEXCOORD0~N 该顶点纹理坐标,0是第一组,一般是flkoat2 或float4类型
COLOR 顶点颜色,通常是fixed4或float4类型
unity 内置的矩阵变换
命令 说明
UNITY_MATRIX_MVP 当前的模型观察投影矩阵,用于将顶点/方向矢量从模型空间变换到裁剪空间
UNITY_MATRIX_MV 当前的模型观察矩阵,用于将顶点/方向矢量从模型空间变换到观察空间
UNITY_MATRIX_V 当前的观察矩阵,用于将顶点/方向矢量从世界空间变换到观察空间
UNITY_MATRIX_P 当前的投影矩阵,用于将顶点/方向矢量从观察空间变换到裁剪空间
UNITY_MATRIX_VP 当前的观察投影矩阵,用于将顶点/方向矢量从世界空间变换到裁剪空间
UNITY_MATRIX_T_MV UNITY_MATRIX_MV 的转置矩阵
UNITY_MATRIX_IT_MV UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可以用于得到UNITY_MATRIX_MV的逆矩阵
_Object2World 当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间
_World2Object _Object2World的逆转矩阵,用于将顶点/方向矢量从世界空间变换到模型空间
unity 顶点转换函数
命令 说明
float4 UnityObjectToClipPos(float3 pos) 将一个点从object空间转换成相机在均匀坐标下的剪辑空间。这就相当于 mul(UNITY_MATRIX_MVP, float4(pos, 1.0)), 应该在它的位置上使用。
float3 UnityObjectToViewPos(float3 pos) 将一个点从object空间转换为view空间。这就相当于mul(UNITY_MATRIX_MV, float4(pos, 1.0)).xyz, 应该在它的位置上使用。
unity 内置的摄像机和屏幕参数
命令 说明
float3 _WorldSpaceCameraPos 该摄像机在世界空间中的位置
float4 _ProjectionParams x=1.0 或-1.0(使用反转的投影矩阵渲染时是负数),y=Near,z=Far,w= 1.0+1.0/Far, 其中near和far分别是近裁剪平面和远裁剪平面与摄像机的距离
float4 _ScreenParams x=width,y=height,z=1.0+1.0/width,w=1.0+1.0/height, 其中width和height分别是该摄像机的渲染目标 (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(该相机是正交相机)或w=0.0(透视相机),其中width和height是正交投影相机的宽和高
float4x4 unity_CameraProjection 该摄像机的投影矩阵
floart4x4 unity_CameraInvProjection 该摄像机的投影矩阵的逆矩阵
float4 unity_CameraWorldClipPlanes 该摄像机的6个裁剪屏幕在世界空间下的等式,按左右上下近远的顺序裁剪平面
UnityCG.cginc 库
UnityCG.cginc 该文件中包含了很多即成的参数方法。使用十分方便
引入文件
CGPROGRAM
#include "UnityCG.cginc"
ENDCG
unitycg.cginc 常用结构
命令 参数 实例 说明
appdata_base 顶点位置、顶点法线、第一组纹理坐标 float4 vertex : POSITION; float3 normal : NORMAL; float4 texcoord: TEXCOORD0; 可用于顶点着色器的输入
appdata_tan 顶点位置、顶点切线、顶点法线、第一组纹理坐标 float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; 可用于顶点着色器的输入
appdata_full 顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标 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; 可用于顶点着色器的输入
appdata_img 可用于顶点着色器的输入 float4 vertex : POSITION; half2 texcoord : TEXCOORD0; 可用于顶点着色器的输入
v2f_img 裁剪空间中的位置、纹理坐标 可用于顶点着色器的输出
unitycg.cginc 常用函数
命令 说明
float4 WorldSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
float4 UnityWorldSpaceViewDir(float4 v) 输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
float4 ObjSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回模型空间中从该店到摄像机的观察方向
float4 WorldSpace LightDir(flaot4 v) 仅用于向前渲染。 输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化
float4 ObjectSpaceLightDir(float4 v) 仅用于向前渲染中,输入一个模型空间中的顶点位置, 返回模型空间中从该点到光源的光照方向。没有被归一化
float4 UnityWorldSpaceLightDir(float4 v) 仅用于向前渲染中,输入一个世界空间中的顶点位置, 返回世界空间中从该点到光源的光照方向。没有被归一化
float3 UnityObjectToWorldNormal(float3 norm) 把法线方向从模型空间中转换到世界空间中
float3 UnityObjectToWorldDir(float3 dir) 把方向矢量从模型空间中变换到世界空间中
float3 Unity WorldToObjectDir(float3 dir) 把方向矢量从世界空间变换到模型空间中
shader数学函数
函数 说明
radians(degree) 角度变弧度(一般默认都用弧度)
degrees(radian) 弧度变角度
sin(angle) 三角函数
cos(angle) 三角函数
tan(angle) 三角函数
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) 指数, log(x)
exp2(x) 2的x次方, log2(x)
sqrt(x) x的根号;
inversesqrt(x) x根号的倒数
abs(x) 绝对值
sign(x) 取当前数值的正负符号,返回 1, 0 或 -1 (x>0;x=0;x<0)
floor(x) 底部取整
ceil(x) 顶部取整
fract(x) 取小数部分
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时使用。 x<=edge0时为0.0, x>=edge1时为1.0
length(x) 向量长度
distance(p0, p1) 两点距离, length(p0-p1);
dot(x, y) 点积,各分量分别相乘 后 相加
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) 矩阵相乘, 每个分量 自行相乘 r[j] = x[j]*y[j];
lessThan(vecX, vecY) 向量 每个分量比较 x < y
lessThanEqual(vecX, vecY) 向量 每个分量比较 x<=y
greaterThan(vecX, vecY) 向量 每个分量比较 x>y
greaterThanEqual(vecX, vecY) 向量 每个分量比较 x>=y
equal(vecX, vecY) 向量 每个分量比较 x==y
notEqual(vecX, vexY) 向量 每个分量比较 x!=y
any(bvecX) 只要有一个分量是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