Unity 内置枚举(Option Stencil)
最近工作强度有点高,实在没有精力再写文章,每天下班回到家小宝宝都睡着了。今天周末,为大家整理最近再工作中需要暴露给美术自己修改的参数(不过大部分美术还是不会懂,我一般傻瓜式的给美术写好备注,blend用什么,A dditive 什么,毕竟美术也没有逻辑性思维),这个文章主要也是写给程序看的 ,之前写了一般的量子力学的波函数文章还没写完,大家担当点,实在是没精力。
截图留真相,确实有在写,请各位大佬多等等。
话不多说,上才艺 :
如图:
直接上代码,看简单注释,可以对应名称查找具体说明 。
Shader "XiongMaoWuDao/XiongMaoWuDao_Enum"
{
Properties
{
[MainColor] _BaseColor("BaseColor", Color) = (1,1,1,1)
[MainTexture] _BaseMap("BaseMap", 2D) = "white" {}
[Header(Option)]
[Enum(UnityEngine.Rendering.BlendOp)] _BlendOp ("BlendOp", Float) = 0 对源和目标颜色进行其他操作,而不是默认的相加
//Blend SrcFactor DstFactor//用同样的因子对rgba进行混合(默认都开启混合)第一个参数对源颜色(当前片元颜色,ps输出的颜色)*SrcFactor混合,
//第二个参数对目标颜色(当前读到的缓冲区颜色)*DstFactor混合,混合后默认相加后会重新写入缓冲区(相加后超过1的自动截断到1)。混合包括RABG值。
//结果都是源颜色和目标颜色与各自因子相乘后再加起来作为输出颜色。
//Blend SrcFactor DstFactor,SrcFactorA DstFactorA//把rgb和a的混合因子分开。
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Float) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Float) = 0
[Enum(Off, 0, On, 1)]_ZWriteMode ("ZWrite", float) = 1 //深度写入
// Greater/GEqual/Less/LEqual/Equal/NotEqual/Always/Never/Off,默认值为LEqual 即当物体深度小于或等于缓存深度值时(越远深度越大),该物体渲染,就是默认的先后顺序渲染。
[Enum(UnityEngine.Rendering.CompareFunction)]_ZTestMode ("ZTest", Float) = 4 //深度测试
[Enum(UnityEngine.Rendering.ColorWriteMask)]_ColorMask ("ColorMask", Float) = 15
[Enum(UnityEngine.Rendering.CullMode)]_CullMode ("Cull", float) = 2 //裁剪
//模板测试
//Stencil如果开启了模板测试,GPU会首先会读取模板缓冲区的值,然后把该值和读取的参考值ref进行比较,比较方式由Comp指定,比如大于Greater就表示通过模板测试,
// 然后由Pass Fail ZFail去指定通过和不通过模板和深度测试后对缓冲区的值进行的Operation处理。
[Header(Stencil)]
[Enum(UnityEngine.Rendering.CompareFunction)]_StencilComp ("Stencil Comparison", Float) = 8
[IntRange]_StencilWriteMask ("Stencil Write Mask", Range(0,255)) = 255
[IntRange]_StencilReadMask ("Stencil Read Mask", Range(0,255)) = 255
[IntRange]_Stencil ("Stencil ID", Range(0,255)) = 0
[Enum(UnityEngine.Rendering.StencilOp)]_StencilPass ("Stencil Pass", Float) = 0
[Enum(UnityEngine.Rendering.StencilOp)]_StencilFail ("Stencil Fail", Float) = 0
[Enum(UnityEngine.Rendering.StencilOp)]_StencilZFail ("Stencil ZFail", Float) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalRenderPipeline" "Queue"="Geometry"}
BlendOp [_BlendOp]
Blend [_SrcBlend] [_DstBlend]
ZWrite [_ZWriteMode]
ZTest [_ZTestMode]
Cull [_CullMode]
ColorMask [_ColorMask]
Stencil
{
Ref [_Stencil] //设置模板参考值
Comp [_StencilComp] //比较方式,有8种比较方式。参数包括Greater/GEqual/Less/LEqual/Equal/NotEqual/Always/Never
ReadMask [_StencilReadMask] //readMask默认是255,一般不用该功能,设置隐码后 读取ref和buff值都需要与该码进行与操作。(0-255)
WriteMask [_StencilWriteMask] //写操作进行与操作
Pass [_StencilPass] //这个是当stencil测试和深度测试都通过的时候,进行的stencilOperation操作方法
Fail [_StencilFail] //这个是在stencil测试通过的时候执行的stencilOperation方法
ZFail [_StencilZFail] //这个是在stencil测试通过,但是深度测试没有通过的时候执行的stencilOperation方法。
}
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float2 uv : TEXCOORD0;
float4 positionHCS : SV_POSITION;
};
TEXTURE2D(_BaseMap);
SAMPLER(sampler_BaseMap);
CBUFFER_START(UnityPerMaterial)
float4 _BaseMap_ST;
half4 _BaseColor;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
return SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv) * _BaseColor;
}
ENDHLSL
}
}
}