【Unity3D Shader编程】之四 热带雨林篇 剔除 深度测试 Alpha测试以及基本雾效合辑

本文深入探讨Unity3D中的Shader编程,包括剔除、深度测试和Alpha测试的概念及语法,以及基本雾效的设置。通过6个Shader实例,展示如何应用这些技术实现热带雨林场景的生动效果。同时,介绍QianMo's Toolkit v1.2的更新,提供游戏场景的可下载资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               


 

 本系列文章由@浅墨_毛星云 出品,转载请注明出处。  

 文章链接: http://blog.csdn.net/poem_qianmo/article/details/41923661

 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442

 邮箱: [email protected]

 

 

本文介绍了Unity中Shader书写中会用到的剔除、深度测试、Alpha测试以及基本雾效相关的语法知识,然后以6个Shader的书写作为实战内容,最后创建了一个生机勃勃的热带雨林场景进行了Shader的测试。依旧是国际惯例,先上本文配套程序的截图。


绿色的海洋:


 

满眼的生机:

 


竹林:

 

 

参天大树:



 

 

飘到脸上的树叶:

 

 

 

 

OK,图先就上这么多。文章末尾有更多的运行截图,并提供了原工程的下载。可运行的exe下载在这里:

 

【可运行的exe游戏场景请点击这里下载试玩】

 

 

 好的,我们正式开始。

 


 

 

 

一、剔除与深度测试(Culling & Depth Testing)相关内容







1.1 剔除(Culling)的概念

 


 对于实时交互的3D环境而言,现实的速度和效率是非常重要的。虽然现在的硬件能力非常的快,但是要想保持30FPS的同时处理数十万的三角形,以现在的主流机器来说还是有些困难的。

为了解决这种问题,人们提出了很多方法,其中有LOD,有Culling。这两种方法并不矛盾,而且我们往往需要在culling的基础上再使用LOD进一步解决pipeline的负担。

剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施。所有几何体都包含正面和反面。剔除基于大多数对象都是封闭的事实;如果你有一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因此我们不需要绘制出背面。因此也被称做背面剔除。

一言以蔽之,所谓剔除,就是被挡住或视角以外的我们看不到的物体,因为它们无关紧要,所以我们就不去绘制,以节省资源,提高场景的运行效率。



 

 


 

1.2 深度测试(Depth Testing)的概念




在复杂的场景中,通常有多个物体需要绘制,这些物体之间通常会存在遮挡关系,离观察点较远的物体会因为近处物体的者的遮挡而不可见或只有部分可见,Direct3D图形系统提供了深度测试功能来实现这种效果。深度测试可以简化复杂场景的绘制,确保只有场景内的对象的最靠近的表面参与绘制。

 

浅墨之前在写DirectX相关博文的时候写过对深度测试的形象化理解,在这边也列出来吧:

把深度测试看做在一口井的井口处向井中观望。把所有物体都赋予一个深度值,放到井中来显示。深度越深的物体,离井口就越远。深度越浅的物体,离井口就越近。井表面的深度值为0。离井口近而深度浅的物体,可能会把离井口远的物体遮挡住。最终显示在屏幕上的开启深度测试后的画面,就如在井口处向井中观望里面物体显示出的遮挡与层次的效果一样。当然,离井口的深度就是每个物体在世界坐标系中的矩阵的Z坐标值了。

 

 

 

1.3 剔除与深度测试(Culling & DepthTesting)相关句法

 




语句之一:Cull Back | Front| Off

此语句用于控制几何体的哪一面会被剔除(也就是不被绘制) 。其中:


  • Cull Back—— 不绘制背离观察者的几何面
  • Cull Front—— 不绘制面向观察者的几何面,用于由内自外的旋转对象
  • Cull Off —— 显示所有面。用于特殊效果。

 

语句之二:ZWrite On | Off

此语句用于控制是否将来之对象的像素写入深度缓冲(默认开启),如果需要绘制纯色物体,便将此项打开,也就是写上ZWrite On。如果要绘制半透明效果,关闭深度缓冲,则用ZWrite Off。


语句之三:ZTest Less |Greater | LEqual | GEqual | Equal | NotEqual | Always

此语句用于控制深度测试如何执行。

缺省值是LEqual (绘制和存在的对象一致或是在其中的对象;隐藏其背后的对象),含义列举对应如下:

 

               

Greater

只渲染大于AlphaValue值的像素

GEqual

只渲染大于等于AlphaValue值的像素

Less

只渲染小于AlphaValue值的像素

LEqual

只渲染小于等于AlphaValue值的像素

Equal

只渲染等于AlphaValue值的像素

NotEqual

只渲染不等于AlphaValue值的像素

Always

渲染所有像素,等于关闭透明度测试。等于用AlphaTest Off

Never

不渲染任何像素

 

 

语句之四:Offset Factor ,Units

此语句用两个参数(Facto和Units)来定义深度偏移。

  • Factor参数表示 Z缩放的最大斜率的值。
  • Units参数表示可分辨的最小深度缓冲区的值。

于是,我们就可以强制使位于同一位置上的两个集合体中的一个几何体绘制在另一个的上层。例如偏移量Offset 设为0, -1(即Factor=0, Units=-1)的值使得靠近摄像机的几何体忽略几何体的斜率,而偏移量为-1,-1(即Factor =-1, Units=-1)时,则会让几何体偏移一个微小的角度,让观察使看起来更近些。

 

 

 



二、Alpha测试(Alpha testing)相关内容讲解




2.1 Alpha测试的概念

 


Unity中,Alpha测试(Alpha Testing)是阻止像素被写到屏幕的最后机会。在Pineline中Alpha测试的位置如下:


 

 

在最终渲染出的颜色被计算出来之后,可选择通过将颜色的透明度值和一个固定值比较。如果比较的结果失败,像素将不会被写到显示输出中。

 

Alpha测试在渲染凹形物体的透明部分时非常有用。显卡上有着每个像素写到屏幕上的深度记录。如果一个新的像素比原来的像素的深度深,那么新的像素就不会被写到屏幕中。

 

让我们看一幅图:


仔细看上图,会发现:

  • 左边的树使用了透明度测试(AlphaTest),注意在它的图形上的像素是如何完全透明或不透明的。
  • 中间的树只使用透明度混合(Alpha Blending)来渲染,注意由于深度缓冲的缘故靠近分支的透明部分是如何覆盖更远的叶子。
  • 最右边的树是通过下文实战中的第六个Shader“6.简单的植被Shader”着色器来渲染的,实现了透明度混合和透明度测试的组合,细节没有粗糙之处,浑然天成。

 

 

 

2.2 Alpha测试相关句法

 



语句之一:AlphaTest Off                 

此语句用于渲染所有像素(缺省)

 

语句之二:AlphaTest comparison AlphaValue


此语句用于设定透明度测试只渲染在某一确定范围内的透明度值的像素。其中的comparison取值为下表之一:


               

Greater

Only render pixels whose alpha is greater  than AlphaValue. 大于

GEqual

Only render pixels whose alpha is greater  than or equal to AlphaValue. 大于等于

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值