一定要在线性空间(Linear Space)中做光照计算
demi 在 周二, 09/17/2019 - 16:47 提交
啥是Gamma Correction?什么是在线性空间(Linear Space)中做光照计算?先介绍下啥是Gamma(别急,先看下去,这是解释线性空间的前置知识)。这词儿N多人听说过,而且也被各种滥用。这里只解释游戏即时渲染相关的概念。首先,就是老式CRT显示器的一个问题,给显示器输入的电压和输出的亮度不成线性关系

啥是Gamma Correction?什么是在线性空间(Linear Space)中做光照计算?先介绍下啥是Gamma(别急,先看下去,这是解释线性空间的前置知识)。这词儿N多人听说过,而且也被各种滥用。这里只解释游戏即时渲染相关的概念。首先,就是老式CRT显示器的一个问题,给显示器输入的电压和输出的亮度不成线性关系

光照用来表示材质和光源之间的相互作用。光照可以和颜色,纹理,以及透明度等一起使用,共同形成屏幕上的视觉外观效果。主要存在三种类型的着色处理方法:扁平、Gouraud、Phong。这3种方法分别基于多边形,顶点,像素来计算光照效果。

在Unity的延迟渲染中,每个光源都可以按照逐像素的方式进行处理,但也有缺点:①不支持真正的抗锯齿功能;②不能处理半透明物体;③对显卡有一定要求。
我们必须要明白我们是如何看到一个物体的,我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的(Reflected)颜色。换句话说,那些不能被物体所吸收(Absorb)的颜色(被拒绝的颜色)就是我们能够感知到的物体的颜色,所以最终的颜色要由光源的颜色以及物体的颜色来共同决定。

Unity 表面着色器为开发者提供了一层简单快速的编写 Shader 的方式,对开发者来说隐藏了光照模型这些复杂的的概念,但是有时候 Unity 自带的光照模型往往不能满足我们的需求,而需要自己定义光照模型。所以接下来就一起看看 Unity 中常见的光照模型函数。

1. 介绍
基于物理的渲染系统用双向反射分布函数(BRDF)来描述物体表面的反射表现。BRDF考虑物体表面各个方向的入射光(环境光)而不是仅仅计算某单一方向的入射光。近年的大量相关研究投入到如何实现环境光照效果与硬件渲染相结合。然而,其大部分的实现过于复杂,而且对硬件的要求过高。另一方面,众所周知,在BRDF实现的主要特性中,环境光照效果并不要求严格的计算的精确性。
所以,后来发展出大量的近似处理技巧来得到可以接受的近似环境光照效果。本文中,我们将介绍一种非常简单的利用已有功能的实现方式。
2. 技巧
环境光贴图(EM)可能是目前模拟环境光照的最简单的方式了。它仅仅是由一些预计算的光照贴图组成。目前最普及的是立方体环境光贴图。预模糊的环境光贴图可以很好的模拟对精确性要求不高的模糊环境光照效果,而且如果环境光贴图用mipmap格式存储,那不同的mipmap级别就代表了不同精度的贴图信息,可以直接拿来用。通过控制环境光贴图的LOD(level of detail)来近似实现物体表面高亮到模糊的表面反射效果。

常见的三个光照模型
(1)漫反射与Lambert光照模型
粗糙的物体表面向各个方向等强度地反射光,这种等同度地散射现象称为光的漫反射(Diffuse Reflection)。产生光的漫反射现象的物体表面称为理想漫反射体,也称为Lambert反射体。
对于暴露在环境光下的Lambert反射体,可以用以下公式表示某点处的漫发射光强:
Iad= K*Ia
其中Ia表示环境光强度,k(0<k<1)为材质对环境光的反射系数,Iad是漫发射体与环境光交互时反射的光强。
理想的环境光是无序的,但是表面光强还依赖于光线的入射方向,这种现象可以用Lambert定律进行数学上的量化。
Lambert定律:当方向光照射到理想反射体上时,漫反射光的光强与入射光方向和入射点便面法向量夹角的余弦成正比。Ild = K*Il*Cosa,其中Ild是漫反射体与方向光交互反射的光强,Il是方向光的光源强度,a是入射光线与定点法向量的夹角,k是材质的反射系数。