Unity入门精要03---透明效果

这篇具有很好参考价值的文章主要介绍了Unity入门精要03---透明效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本节知识架构 

unity设置透明度,Unity着色器学习,unity,游戏引擎

 1.渲染顺序与渲染队列

    如果采用了透明度混合即要是实现半透明效果,那么就要关闭深度写入,那么此时渲染顺序就会变得非常非常重要,不然会出现不正确的遮挡效果。具体的分析可见书中解释

unity设置透明度,Unity着色器学习,unity,游戏引擎

一句话概括就是因为没有写入深度,会导致之后读取的时候没有读取到深度,就可能使其被后面的东西的像素给覆盖。 

为了解决渲染顺序问题,Unity中提供了渲染队列来进行排序,索引号越小越提前被渲染

unity设置透明度,Unity着色器学习,unity,游戏引擎

 我们可以在代码中加入标识来将物体放入渲染队列中

unity设置透明度,Unity着色器学习,unity,游戏引擎

2.透明度测试 

  就是在xx透明度以下的片元都进行舍弃

  只需要在SubShader下(作用于所有Pass)或者Pass通道下加入如下语句

		Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
		//Queue是命令该Shader为AlphaTest,第二个是代表忽略投影器,第三个设置RenderType为自定义的
		//TransparentCutout,这个组是自己定义的名称,常常用于着色器替换来标记所要替换的Shader中的
		//全部Pass或者部分Pass

 在Pass中使用透明度测试的核心语句就是

// Alpha test
  clip (texColor.a - _Cutoff);
// 等价于
//if ((texColor.a - _Cutoff) < 0.0) {
//  discard;
//}

效果如下

unity设置透明度,Unity着色器学习,unity,游戏引擎

 3.透明度混合

   想要进行混合就需要把当前需要渲染的颜色和颜色缓冲区的颜色值进行混合(即之前渲染过的颜色)因此要关闭深度写入和使用ShaderLab的混合命令

unity设置透明度,Unity着色器学习,unity,游戏引擎

书中采用第二个命令

unity设置透明度,Unity着色器学习,unity,游戏引擎 下面给出实现透明度混合的核心代码 

首先在属性中设置引入一个变量用来控制透明度

_AlphaScale ("Alpha Scale", Range(0, 1)) = 1

然后设置Tags

Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

 然后关闭深度写入开启混合


ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
			

 最后返回颜色的时候用Alpha Scale来控制透明度

return fixed4(ambient + diffuse, texColor.a * _AlphaScale);

只有我们开启了Blend的时候控制alpha通道的值进而控制透明度才有意义。

效果如下

unity设置透明度,Unity着色器学习,unity,游戏引擎

但其实还是有缺点的,比如在透明玻璃后的黑线我们没有看到,但其地板后面的边界我们却看到了。

这是因为,Unity默认开启了Cull Back,剔除了背面因此看不到,我们可以使用Cull off关闭

unity设置透明度,Unity着色器学习,unity,游戏引擎

 4.开启深度写入的透明度混合

我们可以使用两个Pass,第一个Pass开启深度写入但不输出颜色,仅用来输入深度数据给ZBuffer,第二个Pass正常渲染半透明

unity设置透明度,Unity着色器学习,unity,游戏引擎

unity设置透明度,Unity着色器学习,unity,游戏引擎

缺点是,物体与物体之间有正确的半透明与遮挡,物体内部有正确的遮挡关系,但却没有半透明的效果 。

ColorMask可以阻止该Pass写入颜色到某一通道中,ColorMask 0代表什么都不输出

ColorMask R代表仅输入R,ColorMask往往可以用来将一个带有颜色背景的特效图片的背景去掉。具体用法可参考如下链接

https://www.cnblogs.com/jietian331/p/10675265.html

5.ShaderLab 的混合命令(背和查,没啥技术含量)

 混合是将RGBA四个通道的值进行混合,必应要开启混合命令(如上),才能进行混合!!!

一句话概括就是设置4个宏来进行加法操作,而这4个宏可以查表

  5.1混合等式参数

   混合的时候需要两个混合等式,一个用来混合RGB通道,另一个用来混合A通道,默认情况下,混合等式使用的都是加操作。每个等式需要两个因子,所以一共需要四个因子。

unity设置透明度,Unity着色器学习,unity,游戏引擎

 unity设置透明度,Unity着色器学习,unity,游戏引擎

unity设置透明度,Unity着色器学习,unity,游戏引擎

 若要进行其它运算

,可以使用BlendOp操作符 下图是BlendOp所支持的命令

unity设置透明度,Unity着色器学习,unity,游戏引擎具体使用案例如下

unity设置透明度,Unity着色器学习,unity,游戏引擎

 6.双面渲染的透明效果

  一句话说,就是利用Cull的渲染,使得物体自身的背部也能背看到。

透明度测试的双面渲染:首先看下原效果

unity设置透明度,Unity着色器学习,unity,游戏引擎

 使用Cull off的透明度测试的双面渲染效果

unity设置透明度,Unity着色器学习,unity,游戏引擎

 透明度混合的双面渲染:

这个就要比透明度测试复杂一点了,因为要打开深度写入,而这又容易导致透明效果出现问题。
具体问题分析是这样的。我们想要保证图像是从后往前渲染。对于透明度测试,我们没有关闭深度写入,所以可以按像素的大小进行深度排序,从而保证渲染正确。而一旦关闭深度写入,若我们直接关闭剔除,就无法保证同一物体正面和背面的渲染顺序。

解决方法如下,双面渲染分成两个Pass,第一个Pass只渲染背面,第二个只渲染正面

unity设置透明度,Unity着色器学习,unity,游戏引擎

 原效果如下

unity设置透明度,Unity着色器学习,unity,游戏引擎

采用了两次Pass渲染后

  unity设置透明度,Unity着色器学习,unity,游戏引擎

舒服了 。文章来源地址https://www.toymoban.com/news/detail-766034.html

到了这里,关于Unity入门精要03---透明效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 设置贴图黑色区域为透明效果

    TexstureType为默认类型 勾选 Alpha from GrayScale 勾选 Alpha Is Transparent 材质球使用默认材质 Shader选为Standard 它的Rendering Mode选择Transparent

    2024年02月15日
    浏览(36)
  • unity shader 入门 全透明与半透明效果实现

    片元函数的fixed4类型的返回值的第4位即为阿尔法值,0代表完全不显示(透明),1代表完全显示。中间的数值代表半透明。但只修改这个值是不能直接修改透明度的,因为还要对队列等进行修改。 本文介绍透明度测试与透明度混合,前者只能制作全透明效果,后者可制作半透明

    2024年02月14日
    浏览(33)
  • Unity中用代码控制物体透明度(物体闪烁简易版)

    之前看了很多文章,有些文章对于只是想简单使用代码控制物体透明度的小伙伴不是很友好,比如我。所以研究了半天找到了很简单的一个方法,在这里分享给初入门想用的小白,希望能给你们带来帮助,同时给自己当作笔记记录一下。      

    2024年02月08日
    浏览(33)
  • Unity之透明度混合与ps的透明度混合计算结果不一致(gamma矫正和线性空间)

    前段时间学习shader时发现了一个问题,一张纯红色透明度为128的图片叠加在一张纯绿色的图片上在unity中得出的结果与ps中的结果不一致。网上查找了ps中的透明混合的公式为  color = A.rgb*A.alpha + B.rgb*(1-A.alpha)。自己计算了一下结果总是不对。  红色透明度128的图           

    2024年02月05日
    浏览(36)
  • unity Image/RawImage贴图透明度渐变/融合 & 正片叠底

    功能需求:UI边界太硬,需要做个渐变看起来更柔和。 最终效果:(UI上方透明度渐变)  正文开始: 方法一:通过获取 Image/RawImage UI顶点数据(color属性的Alpha)来处理。可参考文档-Image透明度渐变(Graphic) 但是,此方法实现透明渐变(自下而上),但是最终透明效果是整张图都

    2024年02月11日
    浏览(32)
  • IOS 类似直播的tableView 顶部透明度渐变效果

    IOS 类似直播的tableView 顶部透明度渐变效果 在工程中,需要类似直播的tableView 顶部透明度渐变效果。这个渐变的效果呢,而且不能有覆盖在背景图上的感觉。底部背景图在没有数据的情况下,没有遮罩效果。首先想到了CAGradientLayer。 CAGradientLayer主要属性 colors var colors: [AnyO

    2024年02月12日
    浏览(33)
  • Android 透明度设置

    目录 一、透明度对照表 二、透明度介绍 三、透明度设置 3.1 xml设置 3.2 代码设置   注:00是完全透明,FF就是完全不透明         我们的UI小姐姐就喜欢给 「不透明度」 ,这个需要自己判断一下。         Android中的颜色值通常遵循RGB/ARGB标准,使用时通常以“#”字符

    2024年02月05日
    浏览(39)
  • ObjectArx 设置填充透明度问题

    初始化透明度参数AcCmTransparency对象时,需要调用setAlpha设置透明度值,这里传入的值是0 255,但cad特性面板上显示的是0 90,且经过测试发现,传入值与特性面板显示的值也是不同的,比如传入90,显示64,百度搜索了个寂寞,最后还是在谷歌找到了答案,原来设置的值和特性面

    2024年02月15日
    浏览(37)
  • WPF 控件设置透明度的方法

    方法一:通过 Opacity 属性设置背景色透明度。范围从0-1,0表示完全透明,看不见。     通过 Opacity 属性去改变控件透明度 会影响子控件的透明度,是因为Opacity属性是在UIElement 类(以及Brush基类)中定义,所有元素都具有该属性; 界面如下图图  方法二:通过Background 属性的

    2024年02月11日
    浏览(34)
  • 《Unity Shader 入门精要》笔记07

    Unity中通常使用两种方法来实现透明效果:第一种是试用 透明度测试(Alpha Test) ,这种方法其实无法得到真正的半透明效果;另一种是 透明度混合(Alpha Blending) 。 由于深度缓冲的存在,可以让不透明物体不考虑他们渲染顺序也能得到正确的排序效果。但是实现透明效果需

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包