大白话版 UnityShader学习(3)-透明效果

大白话版 UnityShader学习(3)-透明效果

根据冯乐乐大小姐的书以及相关资料来进行学习,总结学习经验,分享心得。

透明效果的定义以及相关内容

什么是透明效果,就是光可以完全通过或者部分透过的物体上所发生的状态,称之为透明(个人理解),那么放到Unity里进行解释的话,则无非是RGBA4个通道里,A通道也就是Alpha通道的使用。在过去几年前的手机游戏图像技术发展中,由于开发环境,开发周期以及游戏优化等原因,透明效果其实并不多见。当时大部分的手机游戏表现这种状态的形式是,通过UI图标,原画等形式来简单呈现出这种效果,比较出名的游戏便是仙剑奇侠传1,超级玛丽,忍者神龟等等的2D画面。
随着技术的发展和3D游戏的兴起,半透明似乎成为了一个3D游戏的一个基础表现,当然不只是游戏,很多平台,软件的后台里会默认的写进这种效果来强化你的视觉,以此便于制作人的创作。

言归正传,UnityShader里对这种效果也给出了支持,几个重点:

(1). 计算机对于透明和非透明的物体区分很是简单,A通道为0时,则像素为不显示;A通道为1时,则像素为完全不透明;介于之间的状态则为半透明,那么在我们操作表现上很简单

Properties
{
     _AlphaScale("图片a通道的范围",Range(0,1.0)) = 0.5 //区间为0~1
}

(2). 那么Unity Shader对于实现透明效果的第一种方法便是,透明度测试(Alpha Test),他是Unity默认提供的一种表现方法,Shader里是深度写入,测试俩个字一出现,那么便会想到判断,这种情况会怎么样,那种情况又会怎么样,显然在Shader里这种测试是很纯粹的:要么这个片元满足条件,留下;反之,扔掉。判断的内容一般是小于某个阈值的时候(比如x<= 0.00001),那么这种测试结果会带来一个什么样的效果呢?如果2个物体先后放在摄像头前面,那么测试后要么只能看见后面的,要么只能看见前面的,这种结果没有融合,倒似乎有点像互斥,所以这并不是我们所想要的状态。

(3). 第二种方法,透明度混合(Alpha Blend),这种办法相对于第一种变得灵活起来,在重叠的时候,会根据透明度的比例,对片元进行二次着色,这样来模拟出现实的透明效果,当然这里面会涉及到更多的表现形式,比如透明折射,透明自发光的散射等等。在技术层面上讲,我们关闭了Unity里自带的深度写入,但是并不是我们不需要这个功能了,只是关闭写入,判断依旧是需要的,因为没有深度之分,则透明度混合也没有了意义。也就是说,对于透明度混合来说 ,深度缓冲是只读的

渲染顺序也十分重要

冯姐姐在书中对此写的十分详细,总结几点
(1). 顺序先后十分重要,没有了Shader深度写入的功能,那么它可能会无法渲染出你想要的效果,如场景中有俩个物体,A,B。大概的距离为摄像机—>A—>B,那么问题来了,如果说我们先渲染B,再渲染A的话,B 首先会正常的写入颜色缓冲,之后再和A混合,这样的话,结果是正确的。
(2).反之,如果先渲染A的话,当然A肯定是先写入缓冲,随后B再次渲染的话,就会发现,B似乎在A的前面,这样的话就不正确了。那么这边便提出了渲染的物体越近,就越往后渲染观点。
(3).为解决渲染顺序,unity提供了渲染队列。Queue标签决定模型使用哪个队列

名称队列索引描述
Background1000最早渲染的队列,用于渲染背景
Geometry2000默认渲染队列,不透明物体使用这个
AlphaTest2450透明度测试
Transparent3000使用透明度混合或关闭深度写入的shader
Overlay4000使用一些叠加效果,最后渲染的物体都使用该队列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值