本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.csdn.net/cartzhang/article/details/72420731
作者:cartzhang

三维渲染中的裁剪总汇

一、裁剪的种类

关于渲染中裁剪的问题,搜集了一下跟浅墨做了讨论,大致整理一下。

裁剪是个很大的概念,裁剪包括了视锥体裁剪(应用程序阶段)、视口裁剪(图元装配——几何阶段的最后一步)、背面剔除(光栅化阶段)、遮挡剔除(光栅化阶段)。

1.视锥体裁剪

视锥裁剪算法是在应用程序阶段执行的。虚拟摄像机制定了场景对观察者可见的部分,即我们将依据哪部分3D场景来创建2D图像。

2. 视口裁剪

几何阶段处理结束后,送到光栅化阶段的是一堆三角形面片,所以中几何阶段中需要对顶点进行图元装配。所谓的图元装配,即根据顶点原始的连接关系,还原出模型的网格结构。网格由顶点和索引组成,在之前的流水线中是对顶点的处理,而在这阶段是根据索引将顶点连接中一起,组成线、面单元。然后对超出视口外的三角形进行裁剪(视口裁剪)。

3.背面剔除(光栅化阶段)

渲染的对象都是三角面,有相机,就是有正面和反面。正面可以被看见,反面看不见,就需要渲染,就叫背面剔除。

4.遮挡裁剪

在cry引擎中的遮挡算法,使用的是软件光栅化,大致流程就是,在编辑器中放置一些正交的长方体作为遮挡体,在渲染时,每帧都在CPU上面光栅化这些遮挡体(当然是在分辨率比较小的渲染目标上进行),然后对远处物体进行查询。

现代GPU中运用了Early-Z的技术,在Vertex阶段和Fragment阶段之间(光栅化之后,fragment之前)进行一次深度测试,如果深度测试失败,就不必进行fragment阶段的计算了,因此在性能上会有很大的提升。但是最终的ZTest仍然需要进行,以保证最终的遮挡关系结果正确。

二、遮挡剔除的方法

1. 传统的PVS光线投射子划分

将场景内相交的多边形进行切割,保证场景内的三角形没有相交(如bsp),将屏幕分成8x8的像素网格,做8x8条从视点开始的射线出去即可,这样做能保证比较高效。然后对光线进行碰撞检测看光线落到哪个多边形上。如果相邻射线没有落在同一个三角形上,那么以这两条射线的中点再做出一条新的射线出去,直到相邻射线落在相同的三角形上或者同一个像素上。这样相交多边形中围绕每束光线的多边形基本都能被绘制了。性能很好但存在一定误差,两束光线中间极小的多边形可能被错过。

2. 光栅化线段遮挡法

不同于光栅化z,光栅化z计算量大些,这只是将待渲染多边形光栅化为有左右两个端点的水平扫描线,然后与同一行的扫描线进行比较和切割,只保留最靠近摄像机的线段,如果待绘制线段在该像素行比较下来全部被其它更靠近摄像机的线段覆盖了,则该行不可见,三角形所有行不可见则该包围体不可见。
光栅化z适合gpu,这个方法更适合cpu,特别适合分辨率很高而多边形数量不算太高的时候,优化方法是x轴均匀分为8个区间,这样可以迅速的定位。

3. 八叉树简易PVS

说道简易版本的 PVS,其实就是八叉树了,这是很多3D引擎的偷懒版本实现:八叉树组织空间,下面接 BSP, Portal,地形四叉树lod,先判断顶层包围盒在不在视锥,不再就直接退出了,再的话,递归八个子节点的包围盒再不再视锥,不再就直接剔除,再的话再在该节点递归下去

Untiiy5中的遮挡剔除使用的是Umbra的解决方案,Umbra也在虚幻3和虚幻4中作为插件来使用。

三、讨论的两个问答题

1.在Unity中遮挡剔除在渲染过程中,处于哪个阶段?

遮挡剔除一般在光栅化阶段进行。
关于遮挡剔除,开始的时候觉得应该在应用阶段进行,只需要一个八叉树的搜素,但是这个需要相机来判断,其实相机作为为虚拟相机,只需要给对象做标记即可。
在官方文档中说,遮挡剔除是需要在场景中建立一个虚拟相机,来判断是否可见。准备好后,unity确保只有可见的对象送去渲染 。

unity中的遮挡裁剪以Cell作为基础单元,每个cell对应一个二叉树。unity中使用了两颗树,一棵对应静态对象,一棵对应动态对象。
需要注意的是,对象若太大,对遮挡剔除来说,意义不大,太小构建时间太长,顶点数也多,造成过多的drawCall,总之,注意平衡!没有放之四海而皆准的方法。

2.裁剪,相机(视锥体)的裁剪和背面剔除,这个是分别在不同阶段。

视锥裁剪一般在应用程序阶段进行, 这个没有问题。
而背面裁剪剔除一般在光栅化阶段进行。

背面剔除在光栅化阶段进行,在Vertex Shader 之后,在Fragment Shader片元着色器之前。

更多,想知道若在光栅化阶段进行的遮挡剔除,unity遮挡剔除建立那个空间树干嘛去了?是相机视锥体剪裁的空间辅助裁剪么?

四、参考

【1】https://docs.unity3d.com/Manual/OcclusionCulling.html
【2】https://docs.unity3d.com/Manual/SL-CullAndDepth.html
【3】https://www.zhihu.com/question/38060533/answer/84429692
【4】https://en.wikipedia.org/wiki/Umbra_(3D_technology_company)
【5】https://www.zhihu.com/question/38060533/answer/84432973 韦易笑
【6】http://blog.csdn.net/zhubin215130/article/details/51791529
【7】http://www.cnblogs.com/QG-whz/p/4644213.html?utm_source=tuicool#_label1_5

三维渲染中的裁剪总汇相关推荐

  1. c++ opengl 三维图形中显示文字_为什么使用GPU渲染图形图像,而不使用CPU呢?

    引言 作为程序员,我们或多或少知道可视化应用程序都是由 CPU 和 GPU 协作执行的.那么我们就先来了解一下两者的基本概念: CPU(Central Processing Unit):现代计算机的三 ...

  2. [比较老的文章]三维渲染引擎 OGRE 与 OSG 的比较综述

    1 .引言 随着计算机可视化.虚拟现实技术的飞速发展,人们对实时真 实感渲染以及场景复杂度提出了更高的要求.传统的直接使用底层 图形接口如OpenGL.DirectX开发图形应用的模式越来越暴露出开 ...

  3. OSG三维渲染引擎之OSG简介

    参考书籍<OpenSceneGraph三维渲染引擎设计与实践>,作者王锐,钱学雷 一.场景图形 1.概念 场景图形(Scene Graph)是一种经常用于计算机游戏和图形学相关软件的数据结 ...

  4. 3dsMax插件V-Ray建筑可视化三维渲染细节技术学习教程

    通过学习可用于相机放置.建模.修整等的策略,生成令人印象深刻且逼真的建筑三维渲染.了解如何将您的3D渲染场景提升到一个新的水平,以使您的图像引人入胜.有趣且讨人喜欢.在本课程中,讲师Verena Ta ...

  5. 谈谈GIS三维渲染引擎

    minemap:是我们公司的产品,主要以earth的形态展示,支持矢量切片+倾斜数据(这一点我个人认为是它最大的优点,即兼容了矢量切片精美地图又兼容倾斜数据,目前倾斜数据采用的3dtile格式),目前 ...

  6. 标记三维点_SSW系统在地下大型停车场三维建模中的应用研究

    作 者 信 息 邓学锋,徐 娜,贾 宝 (河南省测绘工程院,河南 郑州 450003) " [摘要]针对地下空间GNSS信号弱.空间狭窄等特殊场景,基于国产SSW移动激光测量系对大型地下停车 ...

  7. ArcGIS Pro建立三维模型(三维渲染)

    一.准备工作 软件:ArcGIS Pro 数据:从bigemap地图下载器上下载的高程和卫图 二.ArcGIS与ArcGIS Pro对比 BIGEMAP下载器上下载的影像一般直接为坐标系为GEO的ti ...

  8. 【TouchDesigner】三维渲染

    Cmera COMP Uniform Scale(按比例缩放):沿x,y,z三个轴等比例缩放相机(通常不建议改变相机大小). Constrain To(约束到):让相机附属到某个指定元件上,跟随指定元 ...

  9. 基于服务器端的三维渲染技术

    Martin等人根据渲染发生在客户端还是服务器端,将三维渲染分为基于客户端的渲染,基于服务器端的渲染和基于混合端的渲染.   基于客户端的渲染 基于服务器端的渲染 基于混合端的渲染 渲染端 客户端 服 ...

最新文章

  1. 星巴克不使用两阶段提交
  2. Xcode 环境变量(绝对路径与相对路径)
  3. 谜题14:转义字符的溃败
  4. Hello World with Spring 3 MVC
  5. linux中如何改IP
  6. 第5 章持久化类(Persistent Classes)
  7. 服务器安装时找不到驱动器,单位有台曙光的A840r-G服务器 由于之前做过RAID 所以在装系统时提前找不到硬盘驱动器...
  8. sdram 时钟相位_SDRAM小结 — Windows Live
  9. qt 两种不同方式的多线程
  10. 计算机机房实训计划,计算机专业实习计划安排.docx
  11. 网络流量分析之流量采集到流量还原
  12. 我爱淘冲刺阶段站立会议2每天任务6
  13. 使用Sentencepiece +CNN进行文本分类
  14. 在hbase shell中执行list抛出异常:ERROR: No valid credentials provided
  15. 如何协助企业IT架构转型
  16. 部署网页到华为云服务器,把网页部署到云服务器
  17. 外贸软件对出口公司的作用
  18. ETH持续暴雷!历史是如此的相似
  19. android如何打开apk文件怎么打开方式,.apk文件用苹果系统怎么打开_apk文件苹果怎么打开...
  20. Java:DateUtils 获取 本上下(周/月)周一周日 最后一天 当月多少天

热门文章

  1. radmin连接电脑都能通,就是不显示桌面的处理办法
  2. 滑动打开组合框有什么作用_防线捍卫者!十大黄金中卫组合盘点!TOP300使用率最高的防线搭档TOP10!...
  3. Andriod Studio
  4. 【题解】慈溪中学-8.12-T3
  5. R语言的四种数据结构---数据框
  6. Linux上的集成开发环境
  7. FPGA视频拼接器的DP 的4k 功能输入, 把lvds 转为 serdes
  8. Web前端教程分享:页面性能优化办法有哪些?
  9. 服务器数据防泄漏,深信达-MCK
  10. 重点人员一体化管控平台建设,重点人口管控轨迹预警系统开发