UnityShader学习——透明效果

原理

  • 透明是游戏中经常要使用的一种效果。在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性——透明度。当透明度为1时,表示该像素是完全不透明的,而当其为0时,则表示该像素完全不会显示。
  • 在Unity中,我们通常使用两种方法来实现透明效果:第一种是使用透明度测试(AlphaTest),这种方法其实无法得到真正的半透明效果(镂空效果);另一种是透明度混合(AlphaBlending)。
  • 对于透明度混合技术,需要关闭深度写入,此时我们就需要小心处理透明物体的渲染顺序。渲染引擎一般都会先对物体进行排序,再渲染。常用的方法是。
    • (1)先渲染所有不透明物体,并开启它们的深度测试和深度写入。
    • (2)把半透明物体按它们距离摄像机的远近进行排序,然后按照从后往前的顺序渲染这些半透明物体,并开启它们的深度测试,但关闭深度写入。
    • (3)如果物体互相重叠,我们不可能得到一个正确的排序顺序。

Unity Shader的渲染顺序

Unity为了解决渲染顺序的问题提供了渲染队列(render queue)这一解决方案。我们可以使用SubShader的Queue标签来决定我们的模型将归于哪个渲染队列。

Unity在内部使用一系列整数索引来表示每个渲染队列,且索引号越小表示越早被渲染。在Unity 5中,Unity提前定义了5个渲染队列(与Unity 5之前的版本相比多了一个AlphaTest渲染队列),当然在每个队列中间我们可以使用其他队列。下表给出了这5个提前定义的渲染队列以及它们的描述。
在这里插入图片描述

ZWrite Off用于关闭深度写入,我们选择把它写在Pass中。我们也可以把它写在SubShader中,这意味着该SubShader下的所有Pass都会关闭深度写入。

分类实现

透明度测试

只要一个片元的透明度不满足条件(通常是小于某个阈值),那么它对应的片元就会被舍弃。被舍弃的片元将不会再进行任何处理,也不会对颜色缓冲产生任何影响;否则,就会按照普通的不透明物体的处理方式来处理它。

通常,我们会在片元着色器中使用clip函数来进行透明度测试。clip是CG中的一个函数,它的定义如下。

函数:

void clip(float4 x); 
void clip(float3 x); 
void clip(float2 x); 
void clip(float1 x); 
void clip(float x);

参数:裁剪时使用的标量或矢量条件。

描述:如果给定参数的任何一个分量是负数,就会舍弃当前像素的输出颜色。

Shader "ShaderBook/Chapter8/AlphaTest" {
   
	Properties {
   
		_Color ("Color Tint", Color) = (1, 1, 1, 1)
		_MainTex ("Main Tex", 2D) = "white" {
   }
		_Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5
	}
	SubShader {
   
		Tags {
   "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
		
		Pass {
   
			Tags {
    "LightMode"="ForwardBase" }
			
			CGPROGRAM
			
			#pragma vertex vert
			#
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值