文章目录
关于Unity的模板测试介绍,可查看之前翻译的一篇:
Unity Shader - ShaderLab: Stencil 模板(缓存)
- 镂空/遮罩
- 镂空
- Masker shader:
- 再看看Be Masked被镂空的shader:
- 注意绘制顺序的问题
- 运行效果
- 遮罩
- 看看Be Masked被遮罩的shader:
- 运行效果
- 看一下绘制顺序的问题
- 描边
- 描边思路
- 整体效果
- 运行效果
- 描边有透视的
- 描边无透视的
- 便于理解模板缓存的伪代码
- 上面的伪代码的验证的地方
- Project
- References
以下的例子实现方式有多种多样,这里为了做示例测试,制作其一一种。
镂空/遮罩 镂空- Masker:确定屏幕空间中,需要镂空的像素的位置,通常绘制对应形状的图元就好,将模板缓存值设置为1(ref 1,comp always(comp always是default值,可以不写,为了方便理解而写上),pass replace),不输入任何颜色(colormask 0)。
- Be Masked:绘制实体对象,只要是模板缓存值为1的,我们都不绘制(ref 1,comp notequal,pass keep(pass keep是default值,可以不写,为了方便理解而写上))
// jave.lin 2019.07.08
Shader "Test/MyStencilMasker" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_Luma("Luma", Range(0, 3)) = 1
}
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry-1" }
Pass {
ColorMask 0
ZWrite off
ZTest always
Stencil {
Ref 1
Comp always // default
Pass replace
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed _Luma;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target {
fixed4 col = tex2D(_MainTex, i.uv);
fixed luma = dot(col.xyz, 1);
if (luma
关注
打赏
热门博文
- 3D Assets (Textures & Model & Animations) & Game Design Ideas & DCC Tutorials & TA
- LearnGL - 学习笔记目录
- Unity - Timeline 知识汇总
- Unity Graphics - 知识点目录 - 停止翻译,因为发现官方有中文文档了
- Graphic资料
- Unity Lightmap&LightProbe局部动态加载(亲测2020以及以上版本官方修复了)
- Unity - 踩坑日志 - 低版本线性颜色空间渲染异常的 “BUG”
- Unity Shader - PBR 渲染 SP 导出的素材
- 什么是 3A 游戏?
- Photosohp - 实现 2D MetaBall、MetaFont