Shader 渲染顺序
先渲染不透明物体,顺序是从前到后;再渲染透明物体,顺序是从后到前
Properties块
属性类型 | CG变量类型 | 定义方式 |
---|---|---|
Int | int | _IntType (“Count”, Int) = 1 |
Float | float,half,fixed | _FloatType(“Rate”, Float) = 1.5 _FloatType(“Rate”, Range(0,5)) = 1.5 |
Vector | float4,half4,fixed4 | _VectorType (“Vector”, Vector) = (1,2,3,4) 四维数 |
Range | float,half,fixed | _RangeType (“Range”, Range(0.1, 0.5)) = 0.2 介于最小值和最大值之间的浮点数 |
Color | float4,half4,fixed4 | _ColorType (“Color”, Color) = (1,1,1,1) 颜色,由RGBA(红绿蓝和透明度)四个量来定义 |
2D | sampler2D | _2DType (“2DTex”, 2D) = “white”{} 2的阶数大小的贴图 在采样后被转为对应基于模型UV的每个像素的颜色 |
Cube | samplerCube | _CubeType (“CubeTex”, Cube) = “white”{} 6张关联的2D贴图,主要用来做反射效果(比如天空盒和动态反射) |
3D | sampler3D | _3DType (“3DTex”, 3D) = “black”{} |
Rect | sampler2D | 非2阶数大小的贴图 |
如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理
如果在Properties使用color, CG里要用fixed4
如果在Properties使用Range, CG里要用half,实际上描述的是一个float
其中贴图属性的字符串要么为空(""),要么为内置的纹理名称(“white”, “black”, “gray”, “bump”)
Properties块中的特殊命令
命令 | 参数 | 说明 |
---|---|---|
[HideInInspector] | ||
[Header(text)] | 不要加引号,不支持中文 | 括号内即为头标题的显示文字 |
[NoScaleOffset] | 隐藏贴图的Tilling和Offset选项 | |
[Toggle] | [Toggle]_toggle("_toggle",int)=0 | 同[MaterialToggle] 模拟开关 1真0假 |
[ToggleOff] | ||
[Gamma] | ||
[Enum(UV0,0,UV1,1)] | [Enum(UV0,0,UV1,1)] | _UVSec (“UV Set for secondary textures”, Float) = 0 |
SubShader块
RenderType
Tags { “RenderType”=“XXX” } 用于替代渲染和获取场景深度和法线信息
名称 | 描述 |
---|---|
Opaque | 不透明:大部分着色器(普通物体,法线,自发光,反射,地形着色器) |
Transparent | 用于半透明着色器(透明物体,粒子,字体,地形附加物(草,花,树)) |
TransparentCutout | 蒙皮透明着色器(两个通道的植被着色器)。用于缕空效果 |
Background | 天空盒着色器 |
Overlay | GUITexture,镜头光晕,屏幕闪光等效果使用的着色器 |
TreeOpaque | 地形引擎中的树皮 |
TreeTransparentCutout | 地形引擎中的树叶 |
TreeBillboard | 地形引擎中的广告牌树,永远面向摄像机 |
Grass | 地形引擎中的草 |
GrassBillboard | 形引擎何中的广告牌草 |
Queue
Tags { “Queue”=“XXX” } 设置渲染队列,值越小越先渲染
名称 | 队列索引 | 描述 |
---|---|---|
Background | 1000 | 最早被调用的渲染,用来渲染天空盒或者背景 |
Geometry | 2000 | 默认渲染队列,不透明物体使用(普通情况,场景中的绝大多数物体应该是非透明的) |
AlphaTest | 2450 | 有透明通道,需要进行Alpha Test的物体的队列,比在Geomerty中更有效 |
Transparent | 3000 | 以从后往前的顺序渲染透明物体,使用透明度混合或关闭深度写入的shader |
Overlay | 4000 | 用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效) |
Tags { “DisableBatching”=“true/false” } 禁用批处理
Tags { “ForceNoShadowCastin”=“true/false” } 禁止投射阴影
Tags { “IgnoreProjector”=“true/false” } 忽略Projector,通常用于半透明物体
Tags { “CanUseSpriteAtlas”=“true/false” } 当该SubShader用于Sprite时用false
Tags { “PreviewType”=“Plane/SkyBox” } 预览形状
Tags { “PerformanceChecks”=“true/false” }
透明效果
透明度测试:不需要关闭深度写入,透明度不达标就去掉,所以物体要么不透明要么完全透明
Tags {“Queue”=“AlphaTest”}
使用clip函数进行透明度测试
透明度混合:可以得到真正的半透明效果。原理是将透明度与颜色缓冲的颜色混合得到新的颜色。但是这需要关闭深度写入。只有关闭深度写入才能把保证半透明物体不影响不透明物体或半透明后面半透明物体的渲染
ZWrite Off
Tags {“Queue”=“Transparent”}
ZTest 深度测试
针对当前对象在屏幕上(更准确的说是frame buffer)对应的像素点,将对象自身的深度值与当前该像素点缓存的深度值进行比较,如果通过了,本对象在该像素点才会将颜色写入颜色缓冲区,否则不写入颜色缓冲
ZTest Less | 深度小于当前缓存则通过 |
ZTest Greater | 深度大于当前缓存则通过 |
ZTest Equal | 深度等于当前缓存则通过 |
ZTest LEqual | 深度小于等于当前缓存则通过 |
ZTest GEqual | 深度大于等于当前缓存则通过 |
ZTest NotEqual | 深度不等于当前缓存则通过 |
ZTest Never | |
ZTest Always | 不论如何都通过 |
ZTest Off | ZTest Off 等同于 ZTest Always |
ZWrite 深度写入
物体是否会写入深度,除了ZWrite状态之外,更重要的是需要深度测试通过,如果ZTest没通过,也不会写入深度
ZWrite On 开启深度写入
ZWrite Off 关闭深度写入
如果深度测试失败,说明这个像素对应的位置,已经有一个更靠前的东西了,即使写入也没有原来的更靠前,那么也就没有必要再去写入深度了,ZTest分为通过和不通过,ZWrite分为开启和关闭,一共就是四种情况:
- 深度测试通过,深度写入开启:写入深度缓冲区,写入颜色缓冲区;
- 深度测试通过,深度写入关闭:不写深度缓冲区,写入颜色缓冲区;
- 深度测试失败,深度写入开启:不写深度缓冲区,不写颜色缓冲区;
- 深度测试失败,深度写入关闭:不写深度缓冲区,不写颜色缓冲区;
Blend 颜色混合模式
Blend Off 关闭颜色混合模式,默认值
Blend SrcFactor DstFactor
最终颜色=SrcFactor源颜色(即计算出来的片元颜色值)+DstFactor目标颜色(即颜色缓冲区中的颜色值)SrcFactor和DstFactor的值可以为以下任一值
One | 1 |
Zero | 0 |
SrcColor | 源颜色(计算出来的片元颜色值) |
SrcAlpha | 源透明度 |
DstColor | 目标颜色(颜色缓冲区中的颜色值) |
DstAlpha | 目标透明度 |
OneMinusSrcColor | 1 - 源颜色 |
OneMinusSrcAlpha | 1 - 源透明度 |
OneMinusDstColor | 1 - 目标颜色 |
OneMinusDstAlpha | 1 - 目标透明度 |
Blend Op 采用操作符进行计算
Add | 源颜色 + 目标颜色 |
Sub | 源颜色 - 目标颜色 |
RevSub | 目标颜色 - 源颜色 |
Min | 取源颜色和目标颜色中的较小者 |
Max | 取源颜色和目标颜色中的较大者 |
Blend OpColor,OpAlpha | 相似,只是把透明通道分离出来了 |
Cull
Cull Back | 剔除内侧,只显示外侧。默认值 |
Cull Front | 剔除外侧,只显示内侧 |
Cull Off | 关闭剔除, 内外都展示 |
LOD
在Unity的Quality Settings中我们可以设定允许的最大LOD,当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用
VertexLit及其系列 = 100
Decal, Reflective VertexLit = 150
Diffuse = 200
Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
Bumped, Specular = 300
Bumped Specular = 400
Parallax = 500
Parallax Specular = 600
Pass块
Name “MYPASSNAME”
为该Pass命名,用于在其他Shader中通过UsePass命令调用该Pass,即使使用小写字母命名,Unity也会自动转为大写字母,所以UsePass命令中也需写成大写字母
GrabPass { “TextureName” }
抓取屏幕并生成纹理,TextureName为自定义纹理名称,默认为_GrabTexture
Tags { “LightMode”=“XXX” }
只有定义了正确的LightMode才能得到一些Unity内置的光照变量
Unity shader中的pass的执行顺序是依据pass在shader中出现的先后顺序来确定的。 然后通过配制每个pass的LightMode Tag,来选择具体执行哪个pass
Unity的摄像机上支持3种RenderingPath,分别是VertexLit,Forward和Dferred Lighting,而shader中的LightMode标签Vertex,ForwardBase,forwardAdd,PrepassBase,PrepassFinal等,分别表示当前pass是为哪一个RenderingPath下设计使用的
名称 | 描述 |
---|---|
Always | |
ForwardBase | |
ForwardAdd | |
Deferred | |
ShadowCaster | |
MotionVectors | |
PrepassBase | |
PrepassFinal | |
Vertex | |
VertexLMRGBM | |
VertexLM |
注:选择了Deferred时,优先选择deferred模式下的pass,如果找不到,则会选择forward模式下面的pass
选择了Forward时,优先选择Forward模式下的pass,如果找不到,则会选择Vertex模式下面的pass
Unity在一个时间只会执行一个渲染路径下的pass
关于这3个渲染路径之外的参数【Always】:
always + deferred:在选择deferred时,只执行deferred的pass
always + vertexLit:都会执行,并且谁靠前谁先执行
always + forward:都会执行,并且谁靠前谁先执行
而无参数执行顺序和always一样
Tags { “PassFlags”=“OnlyDirectional” } 仅传送主平行光、环境光和LightProbe的光照数据
Tags { “RequireOptions”=“SoftVegetation” } 满足给定条件才渲染该Pass
Stencil
模板(缓存)
Stencil buffer(模板缓存)可用于一般的像素遮罩或是剔除像素功能的地方使用。
模板缓存通常是每个像素位占8位的整型数据。缓存可以被写入数据,自增,或是自减。然后draw call时可以检测该像素对应的模板值,来决定在运行像素着色器前是否丢弃该像素。
(注意:上面是官方的说明,但是与实际的渲染管线有些不符,因为Stencil Test是在Fragment Shader之后的,那么有可能是与Early-Z类似的Early-Stencil)
Ref
参考值设置
Ref referenceValue
该值用于比较时参考用的(除了 Comp 设置为 always时,不会考虑比较,直接算是通过),该值也可以控制写入到模板缓存的,具体可以在pass/zfail/fail的StencilOp的枚举中来设置为replace
ReadMask
读入的掩码
ReadMask readMask
一个占8位的掩码,和 0~255的整型数值一样,用于在比较参考值(referenceValue & readkMask)与模板缓存的值(stencilBufferValue & readMask)。默认该ReadMask值为:255(8位bits全是1,意味所有位都可以通过掩码)
WriteMask
写入的掩码
WriteMask writeMask
一个占8位的掩码,和 0~255的整型数值一样,用于在写数据到模板缓存时的位掩码过滤。注意,就像其他的写入数据的掩码一样,指定哪些位是需要写入缓存中的(例如,WriteMask 0 意味着没有数据位的影响,且写入的将会是0)。默认是:255
Comp
设置参考值与模板值的比较方式
Comp comparisonFunction
这个function函数用于将参考值reference value与当前模板缓存的值比较时用的。默认是:always。(always的话,就是不同再比,直接pass过了的意思)
Pass
设置通过后的操作
Pass stencilOperation
当参考值与模板值得比较测试通过后(且深度测试也通过后)应该怎么操作模板缓存中的值。默认:keep。(keep就是保持缓存的值不变,意思不会缓存值有任何操作)
Fail
Fail stencilOperation
当参考值与模板值的比较测试失败后,应该怎么操作模板缓存中的值。默认:keep。(keep就是保持缓存的值不变,意思不会缓存值有任何操作)
ZFail
ZFail stencilOperation
当参考值与模板值的比较通过后,但深度测试没有通过,应该怎么操作模板缓存中的值。默认:keep。(keep就是保持缓存的值不变,意思不会缓存值有任何操作)
Comp,Pass,Fail 和 ZFail 都将应用于几何体的正面测试,除非正面给剔除了,这种情况将用于背面测试。你也可以直接指定两种面向的模板测试的应用,使用这些来定义正面的:CompFront,PassFront,FailFont,ZFailFont(对几何体正面的),和CompBack,PassBack,FailBack,ZFailBack(对于几何体背面的)
Comparison Function
参考值与缓存值的比较功能
枚举 | 描述 |
---|---|
Greater | 仅当参考值比缓存值大时才渲染该像素。 |
GEqual | 参考值大于或等于缓存值,才渲染像素。 |
Less | 小于缓存值 |
LEqaul | 小于或等于缓存值 |
Eqaul | 等于缓存值 |
NotEqaul | 不等于缓存值 |
Always | 不用测试,总是通过。(注意这个是默认值) |
Never | 不用测试,反正都不通过 |
Stencil Operation
模板操作
枚举 | 描述 |
---|---|
Keep | 保持当前缓存值。(默认值) |
Zero | 将0写入缓存值。 |
Replace | 将参考值写入缓存值。 |
IncrSat | 将缓存值自增1.如果缓存值本身255的数值了,那么保持255数据不变。 |
DecrSat | 将缓存值自减1.如果缓存值本身0的数值了,那么保持0数据不变。 |
Invert | 缓存值位取反。(相当于这样子吧:~(Value in buffer)) |
IncrWrap | 将缓存值自增1.如果缓存值本身255的数值了,那么将数据倒回0。 |
DecrWrap | 将缓存值自减1.如果缓存值本身0的数值了,那么将数据倒回255。 |
#include
#include “Lighting.cginc”
包含unity的内置的文件,才可以使用unity内置的一些变量
#prama指令
指令 | 值 | 描述 |
---|---|---|
vertex | 顶点函数名 | 定义顶点函数入口 |
fragment | 片元函数名 | 定义片元函数入口 |
surface | 表面着色器 | 定义表面着色器函数入口 |
target | 2.0/2.5(default)/3.0/3.5(es3.0)/4.0/4.5(es3.1)/4.6(gl4.1)/5.0 | |
geometry | 用于geometry shader,编译目标自动设为4.0 | |
hull | 用于tessellation shader,编译目标自动设为4.6 | |
domain | 同hull | |
only_renderers | d3d9/d3d11/opengl/gles/xbox360/p3/flash | 指定渲染平台 |
exclude_renderers | 同only_renderers | 排除指定平台 |
multi_compile_fwdadd_fullshadows | 开启ForwardAdd中的阴影效果 | |
multi_compile_fwdbase | 用于ForwardBase,保证光照衰减等光照变量被正确赋值 | |
multi_compile_fwdadd | 用于ForwardAdd,保证光照衰减等光照变量被正确获取 | |
multi_compile_fog | 使雾起作用 |
#pragma surface surf Lambert
#pragma surface surfaceFunction lightModel [optionalparams]
surface - 声明的是一个表面着色器
surfaceFunction - 着色器代码的方法的名字
lightModel - 使用的光照模型
CG程序块
Unity shader 由两个相对独立的块组成的
外层的属性声明,回滚等等是Unity可以直接使用和编译的 ShaderLab
CGPROGRAM…ENDCG这样一个代码块中,是一段CG程序
CG程序要访问在Properties中所定义的变量的话,必须使用和之前变量相同的名字进行声明
float:32位存储,用在坐标、未归一化的矢量、uv、一些调整参数
half:16位存储,范围 -60000~60000
fixed:11位存储,范围-2.0~2.0,用于存储颜色、归一化后的矢量、在这个范围内的参数等uv不能用fixed存储,因为可能通过贴图的Tiling和Offset让其范围超过[0, 1]
Unity内置函数
函数 | 说明 |
---|---|
float4 UnityObjectToClipPos(float3 pos) | 将顶点坐标从模型空间转换到裁剪空间 |
float3 UnityObjectToViewPos(float3 pos) | 将顶点坐标从模型空间转换到观察空间 |
TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw) | 根据贴图的tilling和offset值计算uv,需要定义变量“贴图名称_ST”,例:_MainTex_ST |
ComputeScreenPos(float4 pos) | 计算顶点在屏幕空间的位置 |
float3 WorldSpaceViewDir(float4 v) | 输入顶点位置,输出世界空间下顶点到摄像机的方向 |
float3 UnityWorldSpaceViewDir(float4 v) | 输入一个世界顶点,输出世界空间下该点到摄像机的方向 |
float3 ObjSpaceViewDir(float4 v) | 输入顶点位置,输出模型空间下顶点到摄像机的方向 |
float3 WorldSpaceLightDir(float4 v) | 仅用于前向渲染,输入顶点位置,输出世界空间下顶点到光源的方向 |
float3 UnityWorldSpaceLightDir(float4 v) | 仅用于前向渲染,输入一个世界坐标,输出世界空间下该点到光源的方向 |
float3 ObjSpaceLightDir(float4 v) | 仅用于前向渲染,输入顶点位置,输出模型空间下顶点到光源的方向 |
float3 UnityObjectToWorldNormal(float3 norm) | 将法线方向从模型空间转换到世界空间 |
float3 UnityObjectToWorldDir(in float3 dir) | 将方向从模型空间转换到世界空间 |
float3 UnityWorldToObjectDir(float3 dir) | 将方向从世界空间转换到模型空间 |
SHADOW_COORDS(i) | 放在FrowardBase渲染路径下顶点函数的输出结构体中,需引用”AutoLight.cginc”,i是可用寄存器索引用于声明阴影纹理的坐标 |
TRANSFER_SHADOW(o) | 计算结果即为阴影纹理的坐标,o为输出结构体,需放在顶点函数中 |
SHADOW_ATTENUATION(i) | 计算阴影衰减值,需放在片元函数中,i为片元函数的输入结构体,即上式中的o注意:以上三个函数使用时,需保证顶点函数的输入结构体变量为v,结构体的顶点坐标为vertex,输出结构体中的顶点坐标为pos |
float2 ParallaxOffset (half h, half height, half3 viewDir) | 为视差法线贴图计算UV偏移 |
fixed Luminance (fixed3 c) | 将颜色转换为亮度(灰度) |
fixed3 DecodeLightmap (fixed4 color) | 从Unity光照贴图解码颜色(基于平台为RGBM 或dLDR) |
float4 EncodeFloatRGBA (float v) | 为储存低精度的渲染目标,编码[0…1)范围的浮点数到RGBA颜色 |
float DecodeFloatRGBA (float4 enc) | 解码RGBA颜色到float |
float2 EncodeFloatRG (float v) | 类似EncodeFloatRGBA |
float DecodeFloatRG (float2 enc) | 类似DecodeFloatRGBA |
float2 EncodeViewNormalStereo (float3 n) | 编码视图空间法线到在0到1范围的两个数 |
float3 DecodeViewNormalStereo (float4 enc4) | 从enc4.xy解码视图空间法线 |
Unity内置变量
内置变量都在UnityShaderVariables.cginc文件中声明
函数 | 说明 |
---|---|
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 | 将顶点/方向从模型空间转换到世界空间,已修改为unity_ObjectToWorld |
_World2Object | 将顶点/方向从世界空间转换到模型空间,已修改为unity_WorldToObject |
_WorldSpaceCameraPos | 当前渲染的相机在世界空间中的位置 |
_ProjectionParams | x=1(-1),y=near,z=far,w=1+1/far,near和far是近远裁屏幕到相机的距离 |
_ScreenParams | x=width,y=height,z=1+1/width,w=1+1/height |
_ZBufferParams | x=1-far/near,y=far/near,z=x/far,w=y/far |
unity_OrthoParams | x=正交投影相机的宽度,y=正交投影相机的高度,z未定义,w=1(正交相机)/0(透视相机) |
unity_CameraProjection | 该相机的投影矩阵 |
unity_CameraInvProjection | 该相机的投影矩阵的逆矩阵 |
unity_CameraWorldClipPlanes[6] | 该相机的6个裁剪屏幕在世界空间下的等式,存储顺序:左右下上近远 |
UNITY_LIGHTMODEL_AMBIENT | 前向渲染下的环境光信息 |
_LightColor0 | 光源颜色 |
_WorldSpaceLightPos0 | 光源方向(世界空间) |
_LightMatrix0 | 世界空间到光源空间的变换矩阵 |
unity_4LightPosX0 | 仅用于ForwardBase,前4个非重要光源的世界空间下的x坐标 |
unity_4LightPosY0 | 仅用于ForwardBase,前4个非重要光源的世界空间下的y坐标 |
unity_4LightPosZ0 | 仅用于ForwardBase,前4个非重要光源的世界空间下的z坐标 |
unity_4LightAtten0 | 仅用于ForwardBase,前4个非重要光源的衰减因子 |
unity_LightColor | 数组,仅用于ForwardBase,前4个非重要光源的颜色 |
_Time | float4 是自该场景加载开始所经过的时间,4个分量分别是 (t/20, t, t2, t3) |
_SinTime | float4 是时间的正弦值,4个分量分别是 (t/8, t/4, t/2, t) |
_CosTime | float4 是时间的余弦值,4个分量分别是 (t/8, t/4, t/2, t) |
unity_DeltaTime | float4 是时间增量,4个分量的值分别是(dt, 1/dt, smoothDt, 1/smoothDt) |
_CameraDepthTexture | 深度纹理,使用SAMPLE_DEPTH_TEXTURE函数获取深度值,使用Linear01Depth线性化深度值 |
_CameraDepthNormalsTexture | 深度法线纹理,使用DecodeViewNormalStereo(tex2D(_CameraDepthNormalsTexture,i.uv).xy)获取[-1,1]之间的法线值 |
unity_SpecCube0 | 天空盒贴图 |
unity_SpecCube0_HDR | 用来解码天空盒颜色:DecodeHDR(UNITY_SAMPLE_TEXCUBE(unity_SpecCube0,i.worldRefl),unity_SpecCube0_HDR) |
常用语义
从应用阶段传递模型数据给顶点着色器时
语义 | 说明 |
---|---|
POSITION | 模型空间中的顶点位置,通常是float4类型 |
NORMAL | 顶点法线,通常是float3类型(模型空间) |
TANGENT | 顶点切线,通常是float4类型,第四个分量用于存储特殊数值 |
TEXCOORDn | 顶点纹理坐标,常是float2或float4。在Unity Model2和3中,n=8(默认),在4和5中n=16 |
COLOR | 顶点颜色,通常是fixed4或float4类型 |
从顶点着色器传递给片元着色器时
语义 | 说明 |
---|---|
SV_POSITION | 裁剪空间中的顶点坐标,结构体中必须包含一个用该语义的变量 |
COLOR0 | 输出第一组顶点颜色,不必需 |
COLOR1 | 输出第二组顶点颜色,不必需 |
TEXCOORD0~7 | 输出纹理坐标,不必需 |
片元着色器输出
注意:一个语义可以使用的寄存器最多只能处理4个浮点值(float),因此对于4x4矩阵,需要拆分成4个float4类型的变量来存储矩阵数据
语义 | 说明 |
---|---|
SV_Target | 输出值将会存储到渲染目标(render target)中 |
VPOS | 屏幕坐标,x=ScreenWidth+0.5,y=ScreenHeight+0.5,z=[0(near),1(far)],w=1(正交投影)/1/near,1/far |
WPOS | 同VPOS注:使用这两个语义定义的输入input可得到视口空间坐标:input.xy/_ScreenParams.xy另一种等价方法:顶点函数中用ComputeScreenPos计算屏幕空间坐标,再在片元函数中用结果srcPos.xy/srcPos.w |
宏定义
宏 | 说明 |
---|---|
UNITY_UV_STARTS_AT_TOP | 判断当前平台是否DirectX,一半配合_MainTex_TexelSize.y(负数说明开启了抗锯齿)进行uv反转 |
USING_DIRECTIONAL_LIGHT | 判断是否使用平行光 |
CG函数
函数 | 说明 |
---|---|
abs | 计算输入值的绝对值 |
acos | 返回输入值反余弦值 |
all | 测试非0值 |
any | 测试输入值中的任何非零值 |
asin | 返回输入值的反正弦值 |
atan | 返回输入值的反正切值 |
atan2 | 返回y/x的反正切值 |
ceil | 返回大于或等于输入值的最小整数 |
clamp | 把输入值限制在[min, max]范围内 |
clip | 如果输入向量中的任何元素小于0,则丢弃当前像素 |
cos | 返回输入值的余弦 |
cosh | 返回输入值的双曲余弦 |
cross | 返回两个3D向量的叉积 |
ddx | 返回关于屏幕坐标x轴的偏导数 |
ddy | 返回关于屏幕坐标y轴的偏导数 |
degrees | 弧度到角度的转换 |
determinant | 返回输入矩阵的值 |
distance | 返回两个输入点间的距离 |
dot | 返回两个向量的点积 |
exp | 返回以e为底数,输入值为指数的指数函数值 |
exp2 | 返回以2为底数,输入值为指数的指数函数值 |
faceforward | 检测多边形是否位于正面 |
floor | 返回小于等于x的最大整数 |
fmod(x,y) | 返回 x/y 的浮点余数。如果 y 为 0,结果不可预料 |
step(a,x) | 如果 x<a,返回 0;否则,返回 1 |
frac | 返回输入值的小数部分 |
frexp | 返回输入值的尾数和指数 |
fwidth | 返回 abs ( ddx (x) + abs ( ddy(x)) |
isfinite | 如果输入值为有限值则返回true,否则返回false |
isinf | 如何输入值为无限的则返回true |
isnan | 如果输入值为NAN或QNAN则返回true |
ldexp | frexp的逆运算,返回 x * 2 ^ exp |
len / length | 返回输入向量的长度 |
lerp | 对输入值进行插值计算 |
lit | 返回光照向量(环境光,漫反射光,镜面高光,1) |
log | 返回以e为底的对数 |
log10 | 返回以10为底的对数 |
log2 | 返回以2为底的对数 |
max | 返回两个输入值中较大的一个 |
min | 返回两个输入值中较小的一个 |
modf | 把输入值分解为整数和小数部分 |
mul | 返回输入矩阵相乘的积 |
normalize | 返回规范化的向量,定义为 x / length(x) |
pow | 返回输入值的指定次幂 |
radians | 角度到弧度的转换 |
reflect | 返回入射光线i对表面法线n的反射光线 |
refract | 返回在入射光线i,表面法线n,折射率为eta下的折射光线v |
round | 返回最接近于输入值的整数 |
rsqrt | 返回输入值平方根的倒数 |
saturate | 把输入值限制到[0, 1]之间 |
sign | 计算输入值的符号 |
sin | 计算输入值的正弦值 |
sincos | 返回输入值的正弦和余弦值 |
sinh | 返回x的双曲正弦 |
smoothstep | 返回一个在输入值之间平稳变化的插值 |
sqrt | 返回输入值的平方根 |
tan | 返回输入值的正切值 |
fanh | 返回输入值的双曲线切线 |
transpose | 返回输入矩阵的转置 |
tex1D* | 1D纹理查询 |
tex2D* | 2D纹理查询 |
tex3D* | 3D纹理查询 |
texCUBE* | 立方纹理查询 |
几条建议
- 不鼓励在 Shader 中使用流程控制语句(if-else,for,while等),因为会降低 GPU 的并行处理效率
- 把片段着色器上的计算放到顶点着色器中,或者在 CPU 中进行预计算
- 分支判断语句的条件最好是常量
- 每个分支中的操作尽可能少
- 分支嵌套尽可能少