Unity Shader 常用函数变量整理

UnityShader中常用的结构体

    名称              描述              包含的变量
  appdata_base      用于顶点着色器输入        顶点位置、顶点法线、第一组纹理坐标
  appdata_tan           用于顶点着色器输入           顶点位置、顶点切线、顶点法线、第一组纹理坐标
  appdata_full      用于顶点着色器输入           顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标
  appdata_img           用于顶点着色器输入           顶点位置、第一组纹理坐标
  v2f_img           用于顶点着色器输出           裁剪空间中的位置、纹理坐标

struct appdata_img
{
  float4 vertex : POSITION;
  half2 texcoord : TEXCOORD0;
};

struct appdata_base 
{
  float4 vertex : POSITION;
  float3 normal : NORMAL;
  float4 texcoord : TEXCOORD0;
};

struct appdata_tan 
{
  float4 vertex : POSITION;
  float4 tangent : TANGENT;
  float3 normal : NORMAL;
  float4 texcoord : TEXCOORD0;
};

struct 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;
};

struct v2f_img
{
  float4 pos : SV_POSITION;
  half2 uv : TEXCOORD0;
};

UnityShader中常用的帮助函数

float3 WorldSpaceViewDir(float4 v)              输入一个模型顶点坐标,得到世界空间中从该点到摄像机的观察方向

float3 ObjSpaceViewDir(float4 v)               输入一个模型顶点坐标,得到模型空间中从该点到摄像机的观察方向

float3 WorldSpaceLightDir(float4 v)          输入一个模型顶点坐标,得到世界空间中从该点到光源的光照方向(方向没有归一化,且只可用于前向渲染)

float3 ObjSpaceLightDir(float4 v)              输入一个模型顶点坐标,得到模型空间中从该点到光源的光照方向(方向没有归一化,且只可用于前向渲染)

float3 UnityObjectToWorldNormal(float3 norm)  将法线从模型空间转换到世界空间

float3 UnityObjectToWorldDir(in float3 dir)       把方向矢量从模型空间转换到世界空间

float3 UnityWorldToObjectDir(float3 dir)            把方向矢量从世界空间转换到模型空间

float4 UnityObjectToClipPos(float4 pos)                模型坐标抓换为裁剪空间坐标

知识点4:UnityShader中内置变量

变量名                                                                             描         述

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逆转置矩阵,可将法线矢量从模型空间转换到观察空间
_Object2World               当前模型的矩阵,用于将模型顶点/方向矢量从模型空间转换到世界空间
_World2Object                   _Object2World逆矩阵,用于将模型顶点/方向矢量从世界空间转换到模型空间

另外:Unity还提供了能够访问时间、光照、雾效和环境光等目的的变量。这些内置变量大多UnityShaderVariables.cginc中,
跟光照有关的还定义在Lighting.cginc 和AutoLight.cginc中。


常用数学函数

shader变量的精度:

float 32位浮点数
half 16位浮点数
int   32位整形数
fixed 12位定点数
bool  布尔数据
sampler 纹理对象的句柄 共有:sampler、sampler1D、sampler2D、sampler3D、samplerCUBE、和samplerRECT六种。

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 
{sign(x)或者Sign(x)叫做符号函数,在数学和计算机运算中,其功能是取某个数的符号(正或负): 
当x>0,sign(x)=1; 
当x=0,sign(x)=0; 
当x<0, sign(x)=-1;}    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 常用用于平滑处理
smoothstep(edge0, edge1, x): threshod  smooth transition时使用。 edge0<=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-eta*eta*(1.0 - dot(N, I) * dot(N, I)); 如k<0.0 则0.0,否则 eta*I - (eta*dot(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): 所有分量取反 

saturate(v)     v<0 ,取值0,v>1 取值1,否则为v

纹理映射函数


tex1D(sampler1D tex, float s)                         一维纹理查询

tex1D(sampler1D tex, float s, float dsdx, float dsdy)       使用导数值(derivatives)查询一维纹理

Tex1D(sampler1D tex, float2 sz)                     一维纹理查询,并进行深度值比较

Tex1D(sampler1D tex, float2 sz, float dsdx,float dsdy)      使用导数值(derivatives)查询一维纹理, 并进行深度值比较

Tex1Dproj(sampler1D tex, float2 sq)                 一维投影纹理查询

Tex1Dproj(sampler1D tex, float3 szq)                一维投影纹理查询,并比较深度值

Tex2D(sampler2D tex, float2 s)                       二维纹理查询

Tex2D(sampler2D tex, float2 s, float2 dsdx, float2 dsdy)     使用导数值(derivatives)查询二维纹理

Tex2D(sampler2D tex, float3 sz)                     二维纹理查询,并进行深度值比较

Tex2D(sampler2D tex, float3 sz, float2 dsdx,float2 dsdy)  使用导数值(derivatives)查询二维纹理,并进行深度值比较

Tex2Dproj(sampler2D tex, float3 sq)                 二维投影纹理查询

Tex2Dproj(sampler2D tex, float4 szq)                二维投影纹理查询,并进行深度值比较
texRECT(samplerRECT tex, float2 s)
texRECT (samplerRECT tex, float2 s, float2 dsdx, float2 dsdy)  
texRECT (samplerRECT tex, float3 sz) 
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy) 
texRECT proj(samplerRECT tex, float3 sq) 
texRECT proj(samplerRECT tex, float3 szq) 

Tex3D(sampler3D tex, float s)                          三维纹理查询

Tex3D(sampler3D tex, float3 s, float3 dsdx, float3 dsdy)       结合导数值(derivatives)查询三维纹理

Tex3Dproj(sampler3D tex, float4 szq)                   查询三维投影纹理,并进行深度值比较

texCUBE(samplerCUBE tex, float3 s)                    查询立方体纹理

texCUBE (samplerCUBE tex, float3 s, float3 dsdx, float3 dsdy)    结合导数值(derivatives)查询立方体纹理

texCUBEproj (samplerCUBE tex, float4 sq) 查询投影立方体纹理

内置包含文件

  Unity中有类似于C++的包含文件.cginc,在编写Shader时我们可以使用#include指令把这些文件包含进来。这样我们就可以使用Unity为我们提供的一些非常好用的函数、宏和变量。

包含文件的位置:根目录\Editor\Data\CGIncludes

  UnityCG.cginc 包含最常用的帮助函数、宏和结构体
  UnityShaderVariables.cginc    在编译Shader时,会被自动包含进来,包含了许多内置的全局变量,如UNITY_MATRIX_MVP
  Ligghting.cginc   包含了各种内置光照模型,如果编写SurfaceShader的话,会被自动包含进来
  HLSLSurport.cginc 在编译Shader时,会被自动包含进来,声明了很多跨平台编译的宏和定义

  Unity5.2引入了许多新的重要的包含文件,如UnityStandardBRDF.cginc等。这些文件用于实现基于物理的渲染


Author: superzhan
Blog:http://www.superzhan.cn/
GitHub:https://github.com/superzhan
转载时,请注明出处。

发表评论

电子邮件地址不会被公开。 必填项已用*标注