Unity Lighting -- 改善场景的反射光照效果

2023-10-13 05:59

本文主要是介绍Unity Lighting -- 改善场景的反射光照效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Unity中反射光照是如何工作的

        先来看个案例问题,下图中,苹果的反射效果看起来是很奇怪的。

         在它的表面上反射了两种不同颜色的Spot Light光源,还反射了不属于室内环境的来自天空盒的光线,这是有问题的。在解决这个问题之前,我们需要知道在Unity中反射是如何工作的。

Unity中的反射

        在游戏或实时应用中,反射贴图(反射映射,reflection mapping)是用来模拟反射的方法,它会假设所有场景中可反射光的物体都能看到相同的环境。在诸如室外场景的简单开放空间中,这并没有什么问题。但在室内场景或更复杂的环境中则会出点问题(里面会增加许多影响反射的变量)。

        举个例子,想象有一个赛车游戏,其中部分路面通过一个隧道包裹了起来。如果玩家在隧道内的时候,车身仍然反射了天空的光线,那么会非常影响体验。

        在Unity中,我们可以使用Relection Probes来改善场景中的反射效果质量,它通过在关键点上采样环境信息,来确定此处是否会对反射产生影响。

Reflection Probes如何工作

        Reflection Probes在场景中,以一个cubemap的形式记录来自某个点的可见的环境和光照信息,我们可以将它看做是一个立方体,有六个纹理,在立方体的内表面上,这些纹理记录了场景中的特定点的反射信息。这个概念和用于生成天空盒的cubemap是类似的。

        当一个游戏物体的shader访问Reflection Probes的cubemap时, 这个物体表面的每个点能够看到这个cubemap的一小部分,这一小部分的区域是由这个表面的朝向所决定的。Shader在计算游戏物体表面的颜色时,会使用该点对应的cubemap中相关的颜色信息。

        在Unity中每个场景实际上都有一个秘密的Reflection Probe用来采样天空盒。这个Reflection Probe提供了场景中的基础反射信息,这也是前面例子中金属苹果反射了天空光线的原因所在。

        Reflection Probes周围也有一个不可见的盒子来表示其作用范围(zone of effect)的,我们可以配置这个盒子的大小。处于Reflection  Probe作用范围内的反射性物体,计算反射的cubemap是由这个Reflection Probe所提供的。当物体从一个范围移动到另一个范围时,cubemap也会相应改变。之前所提到的赛车游戏中,我们可以为隧道设置一个Reflection Probe,在隧道范围内使用这个Relection Probe所提供的信息来计算反射光照效果。

放置并配置Reflection Probe

        回到最初的那个金属苹果反光问题,我们在场景中放置一个Reflection Probe来解决这个问题:

        1. 在Hierarchy窗口(空白处右键选择Light -> Refleciton Probe)或通过主菜单栏(GameObject -> Light -> Refleciton Probe)添加一个Refleciton Probe

        2. 将Refleciton Probe放置到苹果前面,它越接近苹果的实际位置,反射信息计算就会越精确

            我们会看到,除了spotlight的反射外,放置了Refleciton Probe后,苹果会变成黑色,这是因为苹果进入了Refleciton Probe的作用范围内了(这个作用范围空间是一个立方体表示的,缩放场景可以看到这个盒子)。

         3. 在Refleciton Probe的Inspector中,确认一下Type是Baked。在Runtime Settings中,启用Box Projection属性

         Box Projection属性启用后,苹果表面的反射光计算,会和苹果在Refleciton Probe的作用区域内的位置相关。

        4. 调整一下Box Size的X,Y,Z值以及Reflection Probe的位置,让Refleciton Probe的作用区域覆盖到我们想要的区域(下图黄色框线表示盒子的大小和位置,仅为示例)

         5. 点击Reflection Probe的Inspector面板中最后的Bake按钮进行烘焙

         Reflection Prboe需要独立烘焙,除非我们启用了auto-baking(在Lighting窗口中的Auto Generate选项)。

        6. 最后,来看看烘焙后,这颗金属苹果的反光效果怎么样

这篇关于Unity Lighting -- 改善场景的反射光照效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/201258

相关文章

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使