自我介绍
广东双非一本的大三小白,计科专业,想在制作毕设前夯实基础,毕设做出一款属于自己的游戏!
透明效果
实现透明效果,就要控制透明通道
unity中会有两种方法实现透明效果
- 透明度测试
- 透明度混合
unity里面,倘若场景中包含很多模型时,我们需要考虑他们的渲染顺序来得到正确的排序效果,这就需要
- 深度缓冲(z-buffer):根据深度缓存中的值来判断该片元距离摄像机的距离
- 倘若A挡住B,我们先渲染A,在渲染B时因为深度测试的时候会判断出B离摄像机更远,就不会写入到颜色缓冲中了
但是!
要实现透明度混合时,我们一定要关闭深度写入
- 透明度测试(简单粗暴):只要一个片元的透明度不满足条件(小于某个阈值),那么该片元将会被舍弃,而不会对颜色缓冲产生任何影响
- 透明度混合:实现真正的半透明效果,关闭深度写入,不能关闭深度测试
- 当使用透明度混合渲染时,先比较它的深度值与当前深度缓冲中的深度值,如果该深度值距离摄像机更远,就不进行混合操作(反之则混合),这意味着当一个不透明物体出现在一个透明物体前面,先渲染不透明物体,它仍然可以正常的遮挡住透明物体
unity shader的渲染顺序
解决渲染顺序的问题,unity提出了 渲染队列 这一解决方案
我们可以用SubShader的Queue标签来决定我们的模型将归于哪个渲染队列,索引号越小表示越早被渲染
透明度测试
主要是提供一个新的float变量与主纹理的透明通道值(r)进行比较 来控制需要过滤掉的片元是否显示
Shader "Unlit/016"
{
Properties
{
_MainTex("MainTex", 2D) = "white" {
}
_Diffuse("Diffuse", Color) = (1,1,1,1)
_Cutoff("Alpha Cutoff", Range(0,1)) = 0.5 //决定我们调用clip进行透明度测试时使用的判断条件
}
SubShader
{
//透明度测试使用的渲染队列是 AlphaTest
//"IgnoreProjector"="True" 意味着 这个shader不会受投影器(Projectors)影响
Tags {
"Queue"="AlphaTest" "IgnoreProjector"="True" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Diffuse;
float _Cutoff;
struct v2f
{
float4 vertex : SV_POSITION;
fixed3 worldNormal: TEXCOORD0;
float3 worldPos: TEXCOORD1;
float2 uv : TEXCOORD2;
};
v2f vert (appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);</