目录
alpha测试 1.0
alpha测试 2.0
模板测试 1.0
模板测试 2.0
深度测试
alpha测试 1.0在计算出最终输出颜色之后,颜色可选择性地将其 Alpha 值与固定值进行比较。如果测试失败,则不会将像素写入显示屏。
语法AlphaTest Off
渲染所有像素(默认值),或者…
AlphaTest comparison AlphaValue
设置 Alpha 测试以仅渲染 Alpha 值在特定范围内的像素。
ComparisonComparison 是以下词语之一:
Greater仅渲染 Alpha 大于 AlphaValue 的像素。GEqual仅渲染 Alpha 大于或等于 AlphaValue 的像素。Less仅渲染 Alpha 值小于 AlphaValue 的像素。LEqual仅渲染 Alpha 值小于或等于 AlphaValue 的像素。Equal仅渲染 Alpha 值等于 AlphaValue 的像素。NotEqual仅渲染 Alpha 值不等于 AlphaValue 的像素。Always渲染所有像素。这在功能上等同于 AlphaTest Off。Never不渲染任何像素。
AlphaValue一个介于 0 到 1 之间的浮点数。这也可以是 float 或 range 属性的变量引用,在这种情况下,应使用标准方括号表示法 ([VariableName]) 来编写。
Shader "Hidden/text6"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_alpha ("alpha",Range(0,1)) = 0
}
SubShader
{
Pass
{
AlphaTest Greater [_alpha] //alpha测试
SetTexture[_MainTex]{ //设置材质
combine texture * Previous
}
}
}
}
滑动alpha滑杆时不同的渲染结果
SubShader
{
Blend SrcAlpha OneMinusSrcAlpha
Pass{
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
// just invert the colors
if (col.a < 0.5){ //直接判断透明度
return fixed4 (0,0,0,0);
}
return col;
}
}
}
模板测试 1.0
实现功能:通过面片可以看见立方体,否则看不到
ShaderLab:模板模板缓冲区可用作一般目的的每像素遮罩,以便保存或丢弃像素。
模板缓冲区通常是每像素 8 位整数。该值可以写入、递增或递减。后续绘制调用可以根据该值进行测试,以确定在运行像素着色器之前是否应丢弃像素。
语法 Ref Ref referenceValue
要比较的参考值(如果 Comp 是 always 以外的任何值)和/或要写入缓冲区的值(如果 Pass、Fail 或 ZFail 设置为替换)。值为 0 到 255 之间的整数。
ReadMask ReadMask readMask
这是一个 8 位掩码,值为 0 到 255 之间的整数,用于比较参考值和缓冲区的内容 (referenceValue & readMask) comparisonFunction (stencilBufferValue & readMask)。默认值:_255_。
WriteMask WriteMask writeMask
这是一个 8 位掩码,值为 0 到 255 之间整数,写入缓冲区时使用。请注意,与其他写掩码一样,它指定写操作将影响模板缓冲区的哪些位(例如 WriteMask 0 表示不会影响任何位,也不会写入 0)。默认值:_255_。
Comp Comp comparisonFunction
用于将参考值与缓冲区的当前内容进行比较的函数。默认值:_always_。
Pass Pass stencilOperation
如果模板测试(和深度测试)通过,如何处理缓冲区的内容。默认值:_keep_。
Fail Fail stencilOperation
如果模板测试(和深度测试)失败,如何处理缓冲区的内容。默认值:_keep_。
ZFail ZFail stencilOperation
如果模板测试通过但深度测试失败,如何处理缓冲区的内容。默认值:_keep_。
Comp、Pass、Fail 和 ZFail 将应用于正面几何体,除非指定了 _Cull Front_,在这种情况下将应用于背面几何体。您还可以通过定义 CompFront、PassFront、FailFront 或 ZFailFront(用于正面几何体)以及 CompBack、PassBack、FailBack 或 ZFailBack(用于背面几何体)来显式指定双面模板状态。
比较函数比较函数为以下函数之一:
Greater仅渲染参考值大于缓冲区值的像素。GEqual仅渲染参考值大于或等于缓冲区值的像素。Less仅渲染参考值小于缓冲区值的像素。LEqual仅渲染参考值小于或等于缓冲区值的像素。Equal仅渲染参考值等于缓冲区值的像素。NotEqual仅渲染参考值不同于缓冲区值的像素。Always使模板测试始终通过。Never使模板测试始终失败。 模板操作模板操作为以下操作之一:
Keep保持缓冲区的当前内容。Zero将 0 写入缓冲区。Replace将参考值写入缓冲区。IncrSat递增缓冲区中的当前值。如果该值已经是 255,则保持为 255。DecrSat递减缓冲区中的当前值。如果该值已经是 0,则保持为 0。Invert将所有位求反。IncrWrap递增缓冲区中的当前值。如果该值已经是 255,则变为 0。DecrWrap递减缓冲区中的当前值。如果该值已经是 0,则变为 255。plane:
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MaskValue ("MaskValue",Int) = 1
}
SubShader
{
Pass
{
Stencil {
Ref [_MaskValue]
Comp always //面片需要一直被渲染
Pass replace //如果通过测试则将1写入缓冲区
}
}
}
cube:
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MaskValue ("MaskValue",Int) = 1
}
SubShader
{
ZWrite on //深度测试,当cube位于plane下方时也可以看到
ZTest Always
Pass
{
Stencil {
Ref [_MaskValue]
Comp Equal //判断条件为相等 当前要比较的参考值与缓冲区相等
}
}
}
通过不同的面可以看到不同的游戏物体
创建四个plane,更改MaskValue分别为【1,2,3,4】,创建四个物体,更改MaskValue分别与四个plane对应
剔除是一种优化方式,即不渲染背离观察者的多边形。所有多边形都有正面和背面。剔除利用大多数对象均为封闭体这一事实;如果您有一个立方体,您将永远不会看到背离您的面(前方始终只有一面朝向您),所以我们不需要绘制背离的面。因此有了“背面剔除”一词。
让渲染看起来正确的另一个功能是“深度测试”。深度测试确保在场景中仅绘制距离最近的表面对象。
语法 CullCull Back | Front | Off
控制应该剔除多边形的哪些面(不绘制)
-
Back 不渲染背离观察者的多边形_(默认值)_。
-
Front 不渲染面向观察者的多边形。用于从里到外翻转对象。
-
Off 禁用剔除 - 绘制所有面。用于特殊效果。
ZWrite On | Off
控制是否将此对象的像素写入深度缓冲区(默认值为 _On_)。如果要绘制实体对象,请将其保留为 on。如果要绘制半透明效果,请切换到 ZWrite Off
。有关更多详细信息,请参阅下文。
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
应如何执行深度测试。默认值为 _LEqual_(将前方或远处的对象作为现有对象绘制;隐藏其后面的对象)。
OffsetOffset Factor, Units
允许使用两个参数指定深度偏移:_factor_ 和 units。Factor 相对于多边形的 X 或 Y 缩放最大 Z 斜率,而 units 缩放最小可分辨深度缓冲区值。因此可强制将一个多边形绘制在另一个多边形上,尽管它们实际上位于相同位置。例如,Offset 0, -1
将多边形拉近摄像机并忽略多边形的斜率,而 Offset -1, -1
在观察掠射角时进一步拉近多边形。
半透明着色器
Shader "Transparent/Diffuse ZWrite" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}
SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
LOD 200
// 仅渲染到深度缓冲区的额外通道
Pass {
ZWrite On
ColorMask 0
}
// 粘贴在透明/漫射着色器的前向渲染通道中
UsePass "Transparent/Diffuse/FORWARD"
}
Fallback "Transparent/VertexLit"
}
玻璃剔除:适用于凸面体对象(球体、立方体或汽车挡风玻璃)
Shader "Simple Glass" {
Properties {
_Color ("Main Color", Color) = (1,1,1,0)
_SpecColor ("Spec Color", Color) = (1,1,1,1)
_Emission ("Emmisive Color", Color) = (0,0,0,0)
_Shininess ("Shininess", Range (0.01, 1)) = 0.7
_MainTex ("Base (RGB)", 2D) = "white" { }
}
SubShader {
// 我们在子着色器中定义通道以便在多个通道中使用该材质。
// 此处定义的任何内容都将成为所有包含的通道的默认值。
Material {
Diffuse [_Color]
Ambient [_Color]
Shininess [_Shininess]
Specular [_SpecColor]
Emission [_Emission]
}
Lighting On
SeparateSpecular On
// 设置 Alpha 混合
Blend SrcAlpha OneMinusSrcAlpha
// 渲染对象的背面部分。
// 如果对象为凸面体,那么这些部分始终
// 比正面更远。
Pass {
Cull Front
SetTexture [_MainTex] {
Combine Primary * Texture
}
}
// 渲染面向我们的对象部分。
// 如果对象为凸面体,那么这些部分将
// 比背面更近。
Pass {
Cull Back
SetTexture [_MainTex] {
Combine Primary * Texture
}
}
}
}