热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

初识全局光照

想来,GI的学习也大概有一个月了,不敢说有多深入的理解,至少有了一个感性的了解。记得大二的时候一直很惊叹于3DMAX渲染的图片为什么会有这么真实的效果,当时也没有深究,现在再回过头来看3D

      想来,GI的学习也大概有一个月了,不敢说有多深入的理解,至少有了一个感性的了解。记得大二的时候一直很惊叹于3DMAX渲染的图片为什么会有这么真实的效果,当时也没有深究,现在再回过头来看3DMAX的普通天光渲染,感觉很可能是裸的Final Gathering或者直接AO实现。只是遗憾的是当时只忙着学习怎么操作3DMAX,对其中的道理却一点也不想深究。闲话少说,先来说说GI(Global Illumination)究竟是什么吧。

      还记得光线跟踪(Raytrace)算法么,在它提出之前的光照算法几乎是完全的局部光照算法,以phong着色为例,在不考虑光源光强衰减的情况下物体表面某点的光亮度直接与该点到光源的向量与该点表面法向量夹角余弦值成正比,这一点也很好理解,比如相同的一个平面,其表面朝向和光源方向越正,亮度越高,相反则越暗。当然phong还有可以带镜面反射效果,若光线射到物体表面经过反射后刚好在视线周围的一个范围内,表面的这个点就可以带有高光。另外在所有光线照射不到的地方用一个环境光统一表示它们的亮度。这样,局部光照模型最主要考虑的三种光照参数就是:diffuse(漫反射),specular(镜面反射),ambient(环境光)。这里要着重讨论一下ambient,因为它是后面GI将要解决的关键问题之一。环境光亦可以理解为背景光,它是指由于场景中各个物体表面反射光集合起来所产生的一种各向同性的背景光,它使并不直接暴露在光源下的表面仍然是可见的。

      传统的光线跟踪算法基本上也是使用的这三个参数,但是它是一个递归的过程,当射线击中镜面物体或者透明物体的时候,会产生第二根(甚至很多根)射线,递归求解这些射线击中物体的颜色值,可以轻松模拟镜面或者透明物体的效果,如下图:

可以看出在单光源的条件下,同一个物体上所有光源不能直接照射到的地方都是一个颜色(取决于其环境光的设置),这样显然是不真实的。照成这种原因的根本在于光线跟踪算法的射线只在击中镜面或者透明物体的时候才产生子射线,而在击中漫反射表面的时候其跟踪就停止了。然而现实生活中,光在击中漫反射表面的时候仍然会反弹,由于是朝四面八方反弹,所以这个反弹效果并没有镜面反射的效果那么明显。这样导致的结果就是传统光线跟踪算法不能表现诸如颜色辉映(Color bleeding),焦散(caustic)等效果。

      接下来就是全局光照登场了,它要解决的核心问题就是如何很好地表现物体间的相互反射问题,最直接的问题就是如何找到一种更合理的方式来取代局部光照中的ambient(环境光),它实际上是各个物体表面的光的互相反射的结果。全局光照有多种实现方法,例如辐射度、光线追踪、环境光遮蔽(ambient occlusion)、光子贴图、Light Probe等。当光从光源被发射出来后,碰到障碍物就反射和折射,经过无数次的反射和折射,物体表面和角落都会有光感,像真实的自然光。一种简单且无偏的全局光照求解办法是Path-tracing,它可以看做raytrace的扩展,即在射线击中漫反射表面时也产生子射线,但这里就有一个问题了,因为漫反射表面的反射方向是四面八方的,没有一个固定的方向,因而仅仅只产生一条子射线显然是不行的。Path-tracing的做法是在第一次击中表面时产生大量的射线,然后后面每次只产生一条子射线进行递归。在击中光源之前颜色值为0,直到击中光源之后才开始有了非零的颜色值。这样每条射线对于这个点来说都是一个糟糕的采样值(bad sample),但是在大量这样的采样结果平均起来得到的结果却是正确的。注意标准的Path-tracing求解是无偏的(一些其他的经典方法比如photon mapping是有偏的),虽然其方差很大,为了保证其无偏性,在其递归终止条件中,一般使用类似"俄罗斯轮盘赌"的方式,而不是类似之前raytrace中使用的递归次数上限。理论上当采样次数足够大的时候,Path-tracing得到的结果可以看起来相当真实,但是其耗时确实很成问题。下面附一张Path-tracing的结果作为对照,由于还没有时间做GPU的移植,噪点比较严重:

可以看出使用全局照明的算法得到的结果比传统raytrace的结果明显更加真实。

 

12.1补充:

1.OpenMp优化:介于path-tracing算法天生的并行性,在CPU层面上,还可以对其进行并行优化,提高速度。

2.层次采样:之前的算法中在射线第一次击中漫反射表面时的采样是纯随机采样,这样的采样结果方差有可能非常凌乱,导致算法收敛速度慢,因此噪点比较明显。分层采样是先将总体的单位按照某种特征分为若干层,再从每一层进行纯随机采样。一般情况下分层采样得到的样本的精细度高于纯随机采样,故而可以有效地降低算法的方差(并不是绝对的)。下图解释了二维平面上的分层采样:

在此算法中,可以将目标点正法向量一侧的半球面均分为N*M个区域,然后再在这些区域中各采样一个点。这样,得到的图像噪点减少了:


推荐阅读
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在HTML布局中,即使将 `top: 0%` 和 `left: 0%` 设置为元素的定位属性,浏览器中仍然会出现空白填充。这个问题通常与默认的浏览器样式、盒模型或父元素的定位方式有关。为了消除这些空白,可以考虑重置浏览器的默认样式,确保父元素的定位方式正确,并检查是否有其他CSS规则影响了元素的位置。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • Flowable 流程图路径与节点展示:已执行节点高亮红色标记,增强可视化效果
    在Flowable流程图中,通常仅显示当前节点,而路径则需自行获取。特别是在多次驳回的情况下,节点可能会出现混乱。本文重点探讨了如何准确地展示流程图效果,包括已结束的流程和正在执行的流程。具体实现方法包括生成带有高亮红色标记的图片,以增强可视化效果,确保用户能够清晰地了解每个节点的状态。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
author-avatar
faihiwang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有