UnityShader备忘录
最近在学shaderlab,准备发个文整理整理笔记,持续更新。
目录
1、函数
float3 WorldSpaceViewDir(float4 v) //输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
float3 UnityWorldSpaceViewDir(float4 v) //输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v) //输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向
float3 WorldSpaceLightDir(float4 v) //仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向,没有被归一化
float3 UnityWorldSpaceLightDir(float4 v) //仅可用于前向渲染中,输入一个世界空间的顶点位置,返回世界空间从该点到光源的光照方向,没有被归一化
float3 ObjSpaceLightDir(float4 v) //仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向,没有被归一化
float3 UnityObjectToWorldNormal(float3 norm) //把法线从模型空间转换到世界空间中
float3 UnityObjectToWorldDir(in float3 dir) //把方向矢量从模型空间转换到世界空间中
float3 UnityWorldToObjectDir(float3 dir) //把方向矢量从世界空间转换到模型空间中
float3 Shade4PointLights(...) //仅可用于前向渲染中,计算四个点光源的光照,它的参数是已经打包进矢量的光照数据。前向渲染通常会使用这个函数来计算逐顶点光照
2、语义
POSITION //模型空间中的顶点位置,通常是float4类型 ,w分量默认为1,用于齐次变换,平移变换等等
NORMAL //顶点法线,通常是float3类型,
TANGENT //顶点法线,通常是float4类型 ,w分量为1或-1,用于确定BiNormal的方向
TEXCOORDn //该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,…,通常是float2或float4类型
COLOR //顶点颜色,通常是fixed4或float4类型
SV_POSITION //裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量。等同于DirectX9中的
POSITION,但是最好是使用SV_POSITION
COLOR0 //输出第一组顶点颜色
COLOR1 //输出第二组顶点颜色
TEXCOORD0~TEXCOORD7 //输出纹理坐标
SV_Target //输出值将会存储到渲染目标(render target)中
3、变量
UNITY_MATRIX_MVP //当前的模型*观察*投影矩阵,用于将顶点/方向矢量从模型空间转换到裁剪空间
UnityObjectToClipPos(v) 用于将顶点从模型空间转换到裁剪空间
UnityObjectToViewPos(v) 用于将顶点从模型空间转换到观察空间
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的逆矩阵
unity_ObjectToWorld(_Object2World) //当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间
unity_WorldToObject(_World2Object) //用于将顶点/方向矢量从世界空间转换到模型空间
4、UnityCG.cginc
顶点着色器输入
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;//顶点切线
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
float4 texcoord2 : TEXCOORD2;
float4 texcoord3 : TEXCOORD3;
fixed4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_img
{
float4 vertex : POSITION;
half2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
顶点着色器的输出
struct v2f_img
{
float4 pos : SV_POSITION;
half2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
float4 UnityObjectToClipPos(float3 pos) //在齐次坐标中将一个点从模型空间转换到相机的裁剪空间。这相当于mul(UNITY_MATRIX_MVP, float4(pos, 1.0)),应该用它来代替。
float3 UnityObjectToViewPos(float3 pos) ///将一个点从模型空间转换为观察空间。这相当于mul(UNITY_MATRIX_MV, float4(pos, 1.0)).xyz,应该在它的位置上使用。
float2 TRANSFORM_TEX(texure, name) //Transforms 2D UV by scale/bias property
tex.xy * name##_ST.xy + name##_ST.zw
5、摄像机和屏幕参数
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,y=Far/Near,z=x/Far,w=y/Far,该变量用于线性化Z缓存中的深度值
float4 unity_OrthoParams //x=width,y=height,z没有定义,w=1.0(该摄像机是正交摄像机)或w=0.0(该摄像机是透视摄像机),其中width和height是正交投影摄像机的宽度和高度
float4x4 unity_CameraProjection //该摄像机的投影矩阵
float4x4 unity_CameraInvProjection //该摄像机的投影矩阵的逆矩阵
float4 unity_CameraWorldClipPlanes[6] //该摄像机的6个裁剪平面在世界空间下的等式,按左、右、下、
6、英文名词
空间变换
Clip space | 裁剪空间 |
|
Clip matrix | 裁剪矩阵 | 同投影矩阵 |
View frustum | 视锥体 | 六个裁剪面组成 |
projection matrix | 投影矩阵 |
|
Orthographic projection | 正交投影 | 2D |
Perspective projection | 透视投影 | 3D |
Near clip plane | 近裁剪面 |
|
Screen space | 屏幕空间 | 二维 |
光照
Irradiance | 辐照度 |
|
Scattering | 散射 |
|
Absorption | 吸收 |
|
Refraction | 折射 |
|
Reflection | 反射 |
|
Specular | 高光反射 | 物体表面的反射 |
Diffuse | 漫反射 | 折射,吸收,散射 |
Emissive | 自发光 |
|
Ambient | 环境光 | 其他所有间接光照 |
Global illumination | 全局光照 |
|
Fresnel reflection | 菲涅尔反射 |
|
Isotropic | 各向同性 | 固定视角和光源方向旋转表面 时,反射不会发生任何改变。 |
Anisotropic | 各向异性 |
|