Shaderlab Notizen 3 剔除、深度测试、Alpha测试以及雾效

一、Culling & Depth Testing
1.1 Culling
对于实时交互的3D环境而言,现实的速度和效率是非常重要的。虽然现在的硬件能力非常的快,但是要想保持30FPS的同时处理数十万的三角形,以现在的主流机器来说还是有些困难的。
为了解决这种问题,人们提出了很多方法,其中有LOD,有Culling。这两种方法并不矛盾,而且我们往往需要在culling的基础上再使用LOD进一步解决pipeline的负担。
剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施。所有几何体都包含正面和反面。剔除基于大多数对象都是封闭的事实;如果你有一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因此我们不需要绘制出背面。因此也被称做背面剔除。
一言以蔽之,所谓剔除,就是被挡住或视角以外的我们看不到的物体,因为它们无关紧要,所以我们就不去绘制,以节省资源,提高场景的运行效率。

Paste_Image.png

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

1.3 Culling & Depth Testing基本语法
语句之一: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参数表示可分辨的最小深度缓冲区的值。

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

Paste_Image.png

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

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

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. 大于等于

Less

Only render pixels whose alpha value is less than AlphaValue. 小于

LEqual

Only render pixels whose alpha value is less than or equal to from AlphaValue. 小于等于

Equal

Only render pixels whose alpha value equals AlphaValue. 等于

NotEqual

Only render pixels whose alpha value differs from AlphaValue. 不等于

Always

Render all pixels. This is functionally equivalent to AlphaTest Off.
渲染所有像素,等于关闭透明度测试AlphaTest Off

Never

Don't render any pixels. 不渲染任何像素

而AlphaValue为一个范围在0到1之间的浮点值。也可以是一个指向浮点属性或是一个范围属性,在后一种情况下需要使用标准的方括号写法标注索引名字,如([变量名]).

三、雾效设置
3.1 雾效
雾效(Fog)参数用于控制雾相关的渲染。
在计算机图形学中,雾化是通过混合已生成的像素的颜色和基于到镜头的距离来确定的最终的颜色来完成的。雾化不会改变已经混合的像素的透明度值,只是改变RGB值。

Paste_Image.png

Unity中的缺省雾设定是基于Edit->RenderSettings中的设置的,且雾模式既可以是Exp2也可以是关闭;密度和颜色完全取自设定。
注意如果使用了片段着色器的话,着色器中的雾设定仍然是有效的。如果平台没有对固定管线的雾功能支持,Unity会实时补上着色器以支持需要的雾模式。

3.2 相关语句

语句之一:Fog { FogCommands }
此语句用于设定雾命令的内容,具体的填在大括号之中的内容见下面的语句。

语句之二:Mode Off | Global | Linear | Exp | Exp2
此语句用于定义雾模式。缺省是全局的,依据雾在渲染设定中是否打开确定可从无变化到平方值

语句之三:Color ColorValue
此语句用于设定雾的颜色值。

语句之四:Density FloatValue
此语句以指数的方式设定雾的密度。

语句之五:Range FloatValue , FloatValue
此语句用于为linear类型的雾设定远近距离值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容

  • 卷首语 欢迎来到 objc.io 的第三期! 这一期都是关于视图层的。当然视图层有很多方面,我们需要把它们缩小到几...
    评评分分阅读 1,768评论 0 18
  • 目录结构: 第一步,明确要干嘛 第二步,怎么去画(纯理论) 第三步,怎么去画(实战) 第四步,练练手 第一步,明确...
    半纸渊阅读 8,081评论 18 57
  • 有很多种framework以及很多种方法的组合可以在屏幕上渲染UI元素,我们在这里讨论这个过程中发生的事情,希望这...
    纵横而乐阅读 4,493评论 4 25
  • 绘制像素到屏幕上 answer-huang22 Mar 2014 分享文章 一个像素是如何绘制到屏幕上去的?有很多...
    阿狸旅途T恤阅读 1,637评论 0 7
  • 在工作时,你和其他人一样,都是给公司打工而已,不要指望你的“个性”能引起领导的重视或说重用,好好做好你的工作才是关...
    鼗豸爻爻阅读 73评论 0 0