shader-透明效果

透明

     在实时渲染中要实现透明效果,通常在渲染模型时控制它的透明通道(Alpha Channel)。开启透明混合时,当一个物体被渲染到屏幕后时,每个片元除了颜色值和深度值之外,还有另一个属性透明度。透明度为1,完全不透明,为0,完全透明,像素完全不会显示。在unity中实现方法:1.透明度测试(Alpha Test),但是无法实现真正的半透明效果;2.透明度混合(Alpha Blending);

     渲染顺序问题:在渲染不透明(opaque)物体时,不考虑渲染顺序也能正确的排序效果。由于强大的深度缓冲(depth buffer----------> z-buffer)的存在。深度缓冲用于解决可见性(visibility)的问题,决定那个物体的那个部分会被渲染到前面,那些部分会被其他物体遮挡,基本思想:根据深度缓存中的值来判断该片元距离摄像机的距离,当渲染一个片元时,需要把它的深度值和已经存在的深度缓冲值进行比较(如果开启了深度测试),它的值距离摄像机更远,则说明该片元不该被渲染 到屏幕,否则这个片元应该覆盖掉此时的颜色缓存中的像素值。并把它的深度值更新到深度缓冲中(如果开启的深度写入---ZWrite)。

透明测试和透明混合基本原理:

  • 透明测试:只要一个片元不满足条件(小于某个阈值),那么它对应的片元就会被舍弃。被舍弃的片元不会再进行任何处理,也不会对颜色缓冲产生影响;否则就按照不透明物体的处理方式处理它,深度测试、深度写入等。也就是说,透明度测试不需要关闭深度写入,它和其他不透明物体最大的不同就是根据深度值来舍弃一些片元。----造成要么透明,要么不透明的效果。

  • 透明混合:使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新的颜色。但是透明度混合需要关闭深度写入,所以要控制渲染的顺序,关闭了深度写入如果不关闭,一个半透明表面背后的表面本来是可以透过它被看到,但是由于深度测试时判断结果是该半透明表面距离摄像机更近,导致后面的表面将会被剔除。渲染顺序就变得及其重要,没关闭深度测试,意味着当使用透明度混合渲染一个片元,还是会比较它的深度值与当前深度缓冲的深度值,如果它的深度值距离摄像机更远,就不再进行混合操作,这一点决定了当一个不透明物体出现在一个透明物体前,先渲染了不透明物体,它仍然可以正常地遮挡住透明物体,所以对于透明混合来说,深度缓冲是只读的。-----能够得到半透明效果。

由于透明混合对深度缓冲是只读的,先渲染透明,后渲染的物体会覆盖颜色缓冲中的颜色值。

      (渲染引擎一般都会先对物体进行排序,再渲染)常用的两种方法

  1. 先渲染所有不透明物体,并开启它们的深度测试和深度写入。
  2. 把半透明物体按它们距离摄像机的远近进行排序(多个物体循环重叠无法排序,如果通过网格点来排序,也会出现问题,通常解决办法--分割网格,尽可能让模型是凸表面,减少排序错误;),然后按照从后往前的顺序渲染这些半透明物体,并开启深度测试,但关闭深度写入。

untiy shader渲染队列

 渲染队列(render queue)解决渲染顺序问题,在subshade的Queue标签来决定我们的模型将归于那个渲染队列。在unitu内部使用一系列整数索引表示每个渲染队列,且索引越小越早渲染。

透明度测试

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Unlit/6"
{
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值