实现透明效果的方法:1.透明度测试2.透明度混合

深度缓冲Z-buffer决定了哪个物体的那些部分会被渲染在前面,而哪些部分会被遮挡(比较距照相机的距离),渲染一个片元时需要把他的深度值与已经存在在深度缓冲中的值进行比较,判断并将深度值更新到深度缓冲中(如果开启深度写入)。

透明度测试:某个片元的透明度不满足条件(小于某个值),将直接被舍弃;否则就按不透明物体的方式进行处理,进行深度测试深度写入等,即透明度测试不需要关闭深度写入,效果极端全或无。

透明度混合:实现真正的半透明效果,使用当前偏远的透明度作为因子与已经在颜色缓冲中的颜色值混合,得到新的颜色,需要关闭深度写入,但没有关闭深度测试,如果深度值距摄像机更远,则不进行混合操作。

关闭深度写入后,渲染顺序将影响渲染结果。

解决渲染顺序:渲染队列(subshader中的queue标签)

Background:1000 在所有队列之前渲染,用于绘制背景物体

Geometry:2000 默认渲染队列,大多数物体,不透明物体

AlphaTest:2450 需要透明度测试的物体

Transparent:3000  在所有geometry和alphatest渲染后,再从后往前的顺序渲染,使用了透明度混合的物体

Overlay:用于实现叠加效果

SubShader{Tags{"Queue"="AlphaTest"}Pass{...}
}

透明度测试

透明度测试通常使用clip函数:void clip(floatn x);如果给定的参数任何一个分量是负数,就会舍弃当前像素输出颜色。

在下面的片元着色器中,使用clip函数,将小于给定值(cutoff)的texcolor不显示。

fixed4 frag(v2f i) : SV_Target {fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed4 texColor = tex2D(_MainTex, i.uv);// Alpha testclip (texColor.a - _Cutoff);// Equal to
//              if ((texColor.a - _Cutoff) < 0.0) {
//                  discard;
//              }fixed3 albedo = texColor.rgb * _Color.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));return fixed4(ambient + diffuse, 1.0);}

透明度混合

使用混合命令Blend,设置混合因子,片元源颜色将乘SrcFactor,目标颜色(已经存在于颜色缓冲中的颜色)将乘以DstFactor,再把两者相加存入颜色缓冲。

DstColor(new)=SrcFactor X SrcColor+DstFactor X DstColor(old)

需要调整的设置

更新后的片元着色器,就是在最后输出的透明度上做了变动

关闭深度写入在处理模型本身有复杂的遮挡关系或者包含了非凸网格是会因为排序错误产生错误的效果。

开启深度写入的半透明效果

一种解决方法是使用两个Pass来渲染模型,一个开启深度写入但不输出颜色,仅仅是为了将模型的深度值存入深度缓存中,剔除模型中被自身遮挡的片元,第二个pass进行正常的透明度混合。

此处ColorMask在ShaderLab中用于设置颜色通道的写掩码, 当其设为0时,表示该Pass不写入任何颜色通道。

ShaderLab的混合命令

片元着色器产生一个颜色时,可以选择与颜色缓存中的颜色进行混合,这样这个操作与两个操作数有关:源颜色(S表示片元着色器产生的颜色),目标颜色(D表示从颜色缓冲中读到的颜色),得到的输出颜色记O,都包含RGBA四个通道。

想要得到O需要两个混合等式,分别计算RGB通道和A通道的混合。如果给出两个因子就用同样的因子计算RGB和A的混合等式,如果给出四个混合因子就用其分别计算RGB和A。

上面使用的是正常的透明度混合,一些其他的混合操作和混合因子的命令可以实现变暗变量,类似彩铅画风等。见书P175.

双面渲染的透明效果

透明物体的内部结构在上面的透明度测试与透明度混合中无法看到,因为默认情况下渲染引擎剔除了物体背面(相对于摄像机的方向)的图元,即只有证明,要得到双面效果,就需要通过

Cull指令来控制需要剔除哪个面。

Cull Back|Front|Off    默认为back 当关闭off时即可双面。

透明度测试的双面渲染

只需在透明度测试的基础上加上cull off即可。

透明度混合的双面渲染

由于透明度测试关闭了深度写入,需要严格控制渲染顺序从后往前,为了保证正面背面正确渲染,将双面渲染氛围两个pass一个只渲染正面,一个只渲染背面,渲染的方式和之前透明度混合的相同。

即在一个pass中声明Cull Front,在另一个中声明Cull Back

效果展示。

上述所有的效果汇总:

UnityShader入门精要-透明效果相关推荐

  1. UnityShader入门精要——消融效果

    消融效果 原理:噪声纹理+透明度测试 使用噪声纹理采样的结果和某个控制消融程度的阈值比较,如果小于阈值,就使用clip函数把它对应的像素裁剪掉,这些部分就对应了图中被"烧毁"的区域 ...

  2. UnityShader入门精要-渲染纹理 镜子 玻璃 效果

    通常模式是一个摄像机的渲染结果输出到颜色缓冲内并显示到屏幕上,现代GPU允许我们把场景渲染到一个中间缓冲(渲染目标纹理RTT),与之相关的是多重渲染目标MRT允许我们把场景同时渲染到多个渲染目标中而不 ...

  3. 《UnityShader入门精要》总结(1)理论篇

    紫色:大类概念或简短有力的总结 蓝色:细分概念或重要部分 红色:重要的补充注释 第二章:渲染流程与流程分工 渲染的流程分三个阶段: 应用阶段(开发者控制阶段) 由开发者全权进行管理,控制场景内摄像机位 ...

  4. UnityShader入门精要——顶点动画

    流动的河流 Shader "Unity Shaders Book/Chapter 11/Water" {Properties {_MainTex ("Main Tex&q ...

  5. UnityShader入门精要-9

    目录 1. Unity的渲染路径 前向渲染路径 Unity中的前向渲染 延迟渲染 Unity的光源类型 Unity的光照衰减 Unity的阴影 1. Unity的渲染路径 Unity 5.0之前,有3 ...

  6. [学习笔记]UnityShader入门精要_第12章_屏幕后处理效果

    12.2 调整屏幕的亮度,饱和度和对比度 C# CheckShaderAndCreateMaterial Range OnRenderImage Material.SetFloat Graphics ...

  7. UnityShader入门精要-屏幕后处理效果 亮度饱和度对比度、边缘检测、高斯模糊、bloom效果、运动模糊

    (从这里开始可能会记录的更简略一些,时间紧张想迅速读完这本书的主要内容,可能有的部分不会自己上手做) 屏幕后处理通常指渲染完整个场景得到屏幕图像后,再对图像进行操作,抓取屏幕可以使用OnRenderI ...

  8. [UnityShader入门精要读书笔记]37.水波效果

    在这里,使用一张立方体纹理(cubemap)作为环境纹理,模拟反射.为了模拟折射效果,我们使用GrabPass来获取当前屏幕的渲染纹理,并使用切线空间下的法线方向对像素的屏幕坐标进行偏移,再使用该坐标 ...

  9. UnityShader入门精要-3.3 UnityShader的结构

    一个UnityShader的基础结构如下所示: Shader "ShaderName"{Properties{//属性 } SubShader{//显卡A使用的子着色器 }SubS ...

最新文章

  1. Jtabbedpane设置透明、Jpanel设置透明
  2. 计算机计组成原理课后,计算机组成原理课后习题课(0001).doc
  3. 冒泡排序c++代码_八大排序算法(解释+代码+结果+算法优化)
  4. leetcode:Minimum Depth of Binary Tree【Python版】
  5. 路由器启动后如何定位IOS?
  6. 盘点国内互联网圈中程序员出身的商业大佬,看谁主沉浮!
  7. 土的液塑限计算机自动图形生成,土样液塑限自动
  8. Java PushbackReader mark()方法与示例
  9. android menu width,如何更改Android PopupMenu宽度
  10. 请问孩子厌学的话该怎么办?
  11. php访问方法外变量
  12. event.srcElement 与event.target
  13. 干货 | E-Prime实验数据处理之E-Merge妙招,确定不来看吗?
  14. matlab 矩阵逻辑与,MATLAB矩阵的寻访与赋值
  15. Linux chrome/firefox flash过期问题解决办法
  16. 初窥 Python 的 import 机制
  17. iOS SDK开发二三事
  18. 管理kde wallet
  19. Python学习之路:通过分片的方式修改列表的技巧(拓展知识)
  20. FFT(傅里叶快速变换,详细讲解+推导) 每日一遍,算法再见!

热门文章

  1. Excel根据关键词批量查找提取
  2. RationalDMIS 7.1 程序示例
  3. openstack(Dashboard)web界面
  4. 每日新闻 | 董明珠与雷军开启新赌约:10亿不要了,再赌5年
  5. 太阳能电池板原理及工作原理
  6. 2021年淮安淮安中学高考成绩查询,2021镇江市地区高考成绩排名查询,镇江市高考各高中成绩喜报榜单...
  7. 60度斜坡怎么计算_坡度怎么算
  8. 2015移动安全挑战赛MSC(第二届)第一题解题思路
  9. 高中数学基础01:集合与函数
  10. 使用“宝塔一键迁移”工具,将单机版typecho博客系统迁移到京东云cvm云主机