赞
踩
当一个具有透明度的物体挡住另一个可见问题时,光线会穿过带有透明度的物体,使我们能看到后面那个物体的信息。一般情况吓alpha的值区间为(0-1),0为完全不可见,1为完全可见。
【颜色缓冲区】:也叫帧缓冲区,场景中的物体的像素都要写入该缓冲区,然后再渲染到屏幕上显示
【深度缓冲区】:用于记录颜色缓冲区中每个像素的深度值,通过深度缓冲区,我们可以通过深度测试来确定像素的遮挡关系
【模版缓冲区】:与深度缓冲类似,但这个值是可以自己设定的。,通过设置每个像素的模板缓冲值,就可以指定只渲染某些像素,用于实现类似遮罩之类的效果。
透明测试开启时,当前像素根据设定条件决定是否输出颜色
总的来说深度测试ZTest决定遮挡关系,是否用当前像素替换缓存像素
透明测试alphatest决定是否显示透明度达标的像素,要么完全显示,要么完全不显示
颜色混合blend决定通过测试的像素如果重合如何显示
【当前像素】 当前像素就是指当前shader脚本所属的模型像素
【缓存限速】 准备输出到屏幕上的像素,被称为缓存像素
【透明测试】 实际上就是描述如何使用透明度确定缓存像素的替换规则
【启用深度测试的必要条件】AlphaTest不为Off
【准备工作】
首先创建一个方块A,创建材质与shader并将他们赋给方块。将下面代码放入shader中,并选择一个带有透明度的图片作为贴图。设置_alphaValue值为1
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/B" { Properties { _MainTex ("贴图", 2D) = "white" {} _BackgroundColor ("背景颜色", Color) = (1, 1, 1, 1) _alphaValue("alpha", range(0.00,1.00)) = 0.5 } SubShader { Pass { //设置透明队列 Tags {"Queue" = "Transparent" "RenderType"="Transparent" } //关闭裁剪,这样透过镂空的地方就能看到后面了 Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag //从程序传染顶点渲染器的数据 struct a2v { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; //从顶点渲染器传入片元渲染器的数据 struct v2f { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; //格子背景 sampler2D _MainTex; fixed4 _BackgroundColor; fixed _alphaValue; //顶点着色器 v2f vert (a2v v) { v2f o; //将像素空间从模型转为裁剪空间 o.position = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } //片段着色器 fixed4 frag (v2f o) : COLOR { //组装贴图和uv与背景颜色合成像素 fixed4 renderTex = tex2D(_MainTex, o.uv) * _BackgroundColor; //clip 函数等同于 //if((renderTex.a - _alphaValue)<0.0){ // discard; //} //透明测试 核心函数,满足透明度条件才显示 clip(renderTex.a - _alphaValue); //合成贴图、遮罩、线的像素 return renderTex; } ENDCG } } }
表面着色器需要时用单独的命令
深度测试指令:
//启用透明测试,如果当前像素透明度大于 _alphaValue 值,就显示该像素,否则就放弃
alphatest greater [_alphaValue]
命令:
指令 | 说明 | 实例 |
---|---|---|
Greater | 当前像素透明度 > 指定数值,就显示当前像素。否则就放弃 | alphatest greater [_alphaValue] //类似于抠图 |
Less | 小于 | 类似于反向抠图 |
GEqual | 大于等于 | |
LEqual | 小于等于 | |
Equal | 等于 | |
NotEqual | 不等于 | |
Always | 总是 | |
Never | 永不 | |
Off | 关闭 |
【shader代码】
Shader "Custom/B" { Properties { _MainTex ("贴图", 2D) = "white" {} _BackgroundColor ("背景颜色", Color) = (1, 1, 1, 1) _alphaValue("alpha", range(0.00,1.00)) = 0.5 } SubShader { Tags {"Queue" = "Transparent" "RenderType"="Transparent" } //关闭裁剪这样就嫩看到镂空的背面 Cull Off //关闭深度写入 ZWrite Off //透明测试 开启透明测试,当前限速透明度 > _alphaValue 时,显示当前限速 AlphaTest Greater [_alphaValue] Pass { //输出颜色 SetTexture[_MainTex] } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。