当前位置: 首页 > news >正文

基于体素的全局光照技术

基于预计算的实时渲染方法,这些方法的核心是使用低阶的球谐(或小波)函数来表述某个低频的方向分布函数,例如环境贴图和大面积光源,由于这些方向分布函数可以使用少量的球谐函数系数来近似,这使得实时的间接光照计算被大大加速。然而这些方法的限制也非常明显,他们只能处理场景的静态部分,并且它们只能处理方向分布函数的低频部分。

下面我们介绍两种能够处理动态场景的实时渲染方法,即本章基于体素的全局光照算法和下一章基于距离场的全局光照算法。

全局光照的计算量非常大,这主要有两个原因:首先,它需要计算3D场景当中任意两个点之间的可见性,这种可见性判断对于基于光栅化的实时渲染流程更加复杂,光栅化擅长于每次处理一个视图,它通常并不能直接计算出任意两点之间的可见性,因此这就是为什么光栅化通常只计算直接光照,而更复杂的间接光照(即全局光照)留给其他一些近似方法(比如预计算的方法);其次,表面上每个点的光照计算涉及对表面法线方向上半空间范围内所有方向的积分计算,这个积分计算已经被证明是非常复杂,以至于目前还不能用于实时计算。

在本书前面介绍的大部分光照技术中,我们都使用三角形等曲面作为基元(primitives)来表述物体的表面,这种表述的细节层次(level of details)被存储在纹理当中,在进行着色的时候,我们需要首先找到光线与之相交的物体,然后选择该物体表面对应细节层次的多级纹理进行着色计算。[Crassian et al. 2009]说明,使用体积数据作为几何基元来表述物体表面,这种数据结构能够更高效地计算着色需要的细节层次。随后[Crassian et al. 2011]提出了体积圆锥体追踪(voxel cone tracing)的概念,在这种方法中,场景中的网格数据被近似为一个阶层式的体素八叉树结构,这个八叉树结构可以同时用于加速可见性和光照的计算,通过对该体积结构执行类似多级纹理的预过滤,围绕多个方向的光照积分计算被大大加速。

基于体素的全局光照技术是一种非常优雅的光照技术,自从被提出之后,它已经被大量的游戏引擎采用,例如它最先被集成进了虚幻引擎,此外,该技术也已经被集成进了CryEngine3中。

11.1 圆锥体内的光线追踪
在开始正式介绍基于体素的全局光照技术之前,我们需要了解一个该技术基于的一个核心概念,即圆锥体追踪(cone tracing)。
实际上,圆锥体追踪早至1984年已经被提出,如今它被广泛用于一些基于体积基元结构的场景表述中,例如本章介绍的基于体素的全局光照技术和下一章介绍的基于距离场的全局光照技术。由于圆锥体追踪是这两种全局光照技术的核心,本节就先来了解圆锥体追踪的该概念。

11.1.1 光线追踪的问题
圆锥体追踪是由光线追踪演变而来的,在光线追踪中,一条光线从摄像机发出,穿过虚拟屏幕上某个像素的中心进入到场景当中,如图所示,一旦该光线离开这个像素,它与该像素的任何联系都因此而消失,因此光线仅仅被定义为由一个起点和一个方向组成的一条直线。这种简单的定义使得光线与任意物体的相交计算变得非常直观,然而它也有缺点。

上述关于光线的定义的主要问题在于,每个像素对应相关的所有光线没有保留足够的信息去执行反走样(anti-aliasing),每条光线仅仅允许我们在一个像素的面积范围内采样得到一个位置,但是它不知道关于这个采样点周围相邻的任意位置的信息,例如这些位置是否可见,在多大面积内采样是足够等。

在标准的光线追踪中,其唯一能够实现反走样的方法是使用更高的分辨率进行采样,例如[Whitted, 1979a]提出了适应性采样。但是这种超采样技术存在一些问题,首先是那些方差较大的像素对应的光线数量会急剧地增长;其次,一些较小的细节可能被这些样本所忽略。

一种能够应对上述采样问题的方法是修改上述关于“光线”的定义为一个“圆锥体”。如图11.1(b)所示,此时一个“像素”表述的是屏幕上的一个“面积”而不是一个“点”,这种扩展的“光线”(即圆锥)与物体的相交计算不仅能够决定该光线与某物体的相交测试是否发生,并且还能决定该“光线”的多少部分与该物体相交。这种部分覆盖信息足够针对面积执行简单的反走样,同时,一个像素内的任意细节都不会被忽略。

相关文章:

  • 路径追踪技术
  • 辐射度方法
  • [计算机体系结构:量化研究方法]学习笔记:Chapter 1
  • 基于预计算辐射传递的全局光照技术
  • 傅里叶变换
  • PhpStorm插件之Translation
  • 小波变换原理
  • 如何通俗地理解傅立叶变换?
  • T函数
  • 分部积分法
  • mssql sqlserver 使用SSMS运行sql脚本的六种方法分享
  • 探讨基于球谐函数的全局光照
  • vue的实例属性$data
  • unity中的球谐光照
  • Python简介
  • 【知识碎片】第三方登录弹窗效果
  • android 一些 utils
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • C++入门教程(10):for 语句
  • CentOS7简单部署NFS
  • Django 博客开发教程 16 - 统计文章阅读量
  • JavaScript服务器推送技术之 WebSocket
  • Linux后台研发超实用命令总结
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • node入门
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • TypeScript实现数据结构(一)栈,队列,链表
  • 程序员最讨厌的9句话,你可有补充?
  • 初识 webpack
  • 搭建gitbook 和 访问权限认证
  • 解决iview多表头动态更改列元素发生的错误
  • 实现菜单下拉伸展折叠效果demo
  • 树莓派 - 使用须知
  • 数据科学 第 3 章 11 字符串处理
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 一道闭包题引发的思考
  • 一个完整Java Web项目背后的密码
  • 自制字幕遮挡器
  • UI设计初学者应该如何入门?
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​configparser --- 配置文件解析器​
  • (1)SpringCloud 整合Python
  • (11)MATLAB PCA+SVM 人脸识别
  • (2)STM32单片机上位机
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (zhuan) 一些RL的文献(及笔记)
  • (zt)最盛行的警世狂言(爆笑)
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?