| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> 透明的渲染 -> 正文阅读 |
|
[游戏开发]透明的渲染 |
透明分为两种:透明测试(Alpha Test),透明混合(Alpha blending),其中透明度测试只是根据Alpha通道 阈值把对应的像素discard丢弃,得到的并不是真正的透明!Alpha blending是得到真正的透明。 透明要想正确就不得不说顺序问题,对于不透明的物体由于有Z-Test,Z-buffer记录深度值像素的遮挡等等都会剔除掉,甚至都没什么overdraw,但是透明物体就不一样了要把Z-Test、Z-write 关闭,导致没有顺序!顺序问题一直是困扰图形界的一大难题,特别是为了能真正透明渲染出来,对于有自遮挡、自相交、循环重叠、A与B有交集等等情况需要处理就需要OIT来解决,但是正确与性能开销现在是鱼与熊掌不可兼得,怎么平衡与舍弃在实时渲染中的各大引擎都有不同做法,比如threejs是直接不处理! 透明与不透明物体:要想让混合在多个物体上工作,我们需要最先绘制最远的物体,最后绘制最近的物体。普通不需要混合的物体仍然可以使用深度缓冲正常绘制,所以它们不需要排序。但我们仍要保证它们在绘制(排序的)透明物体之前已经绘制完毕了。当绘制一个有不透明和透明物体的场景的时候,大体的原则如下:
透明物体不开Z-test与erlay-z ,只有从后往前渲染才能得到正常的!其余的不透明的有遮挡的只需要从前往后渲染! 透明测试:只要一个片元的透明度不满足条件(通常是小于莫格阈值)与之对应的片元会被舍弃,被舍弃的片元不会做任何的处理,也不会对颜色缓冲有任何的影响;比如在unity中的片元着色器:
透明度混合:启动混合:
混合公式: ThreeJs的透明:threejs里面透明物体渲染本来就有问题的,两种方式,一种是设置renderOrder渲染顺序一种是自己实现渲染流程,第二种实现单独较大要对threejs渲染流程有清晰的认识,然后通过后处理的形式定制自己的渲染流程。blending也可以试试治标不治本,透明渲染问题是threejs一直有的问题。 there.js例子: Material属性:
threejs的所有对象都是Object3D,其中 Object3D.renderOrder这个属性值将使得**scene graph(场景图)**中默认的的渲染顺序被覆盖, 即使不透明对象和透明对象保持独立顺序。 渲染顺序是由低到高来排序的,默认值为0。要处理透明光追处理透明物体问题很好,要实时渲染!(threejs的排序是根据场景图中的mesh的排序) 透明引发的性能问题OverDraw:OverDraw是什么? 透明:少用透明, 半透明材质; 现在渲染管线一般优化都挺好的啊?我一下能想到的只有半透明会导致overdraw, 后处理一通乱叠OverDraw也会很高,不过后处理性能问题相比半透明特效来说好优化一些, early z pass的时候就做好剔除。 多层透明深度冲突如图所示: 次序无关透明度(Order Independent Transparency, OIT)实现半透明渲染的通常做法是将在场景不透明物体完成渲染之后,对场景中半透明物体到摄像机的距离进行排序,从距离摄像机最远的(Z值最大)的物体开始逐个叠加渲染,并在渲染中与输出缓冲中的原有颜色进行混合叠加。对于 2D 半透明渲染,这样的实现是足够的,而在 3D 场景中,由于排序基于物体的轴点位置,渲染时会出现以物体为单位的覆盖效果,例如物体间循环覆盖的效果,就无法被正确的渲染。( oit在shader里创建一个链表然后排序混合就完了 红宝书里有完整例子) 如果您的引擎确实需要顶级的透明效果,这里有一些值得研究的技术: 上古时期有叫画家算法:本质上就是从远处往近地绘制物体,这样遮挡九正确啦,有了Z-test 后充分利用硬件的early-z特性,会从近处远处排序物体(在移动端不管是tbr或者tbdr都是一样的),同理适合半透明的混合,本身混合与顺序无关!
有序透明: A buffer区是 1984 年引入的一种计算机图形技术,它将片段数据(包括微多边形信息)的每个像素列表存储在软件光栅化器雷耶斯渲染 中,最初设计用于抗锯齿但也支持透明度。同时,已经有硬件能够通过执行硬件计算来促进这项任务,这是开发人员获得开箱即用透明度的最方便的方式。SEGA Dreamcast是为数不多的在其硬件中实现了自动逐像素半透明排序的控制台之一。 Depth Peeling:深度剥离方法,出自 NVIDIA,其核心思想是从相机触发,经过 N(可配置)个 PASS 将场景中的半透明物体根据深度分成了 N 层,分别记录每层的颜色和深度,然后再将每层的颜色混合起来。后来 NVIDIA 为了优化剥离性能,又提出了一种在一个 PASS 中同时剥离 最前面一层 和 最后面 的方法,被成为 Dual Depth Peeling。 Depth Peeling 是一种很慢,非常费显存空间(空间分配可确定),但对硬件没什么高要求的 OIT 方法。 开销是需要两张 depth buffer 。渲染过程需要 N 个 pass , N 是半透明的层数。改进的 Dual Depth Peeling 算法需要 N/2+1 个 pass 。
Depth peeling 是近来研究比较热的半透明渲染方案,其中基于链表的 dx11 实现是一个不小的突破。将来有可能成为比较实用的方案。 Depth Peeling的例子: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 18:23:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |