本文主要是介绍使用Compute Shader加速Irradiance Environment Map的计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- Irradiance Environment Map基本原理
Irradiance Environment Map(也叫Irradiance Map或Diffuse Environment Map),属于Image Based Lighting技术中的一种。
Irradiance Map的详细定义可参考GPU Gems2 Chapter 10.“Real-Time Computation of Dynamic Irradiance Environment Maps”。简单说来就是一种用于近似Environment Diffuse Lighting的方法。想象一个场景中有k个方向光,方向分别为d1…dk,光照强度为i1…ik,对于一个法线和Diffuse Color分别为n和c的Lambert表面,其光照强度为:
对于Environment Lighting,我们可以用一个Cube Map来表示,Cube Map里的每一个texel就是一个方向光,光强度为texel的值,方向为texel的location。这样就能通过一个Cube Map来表示任意的Environment Lighting。一般把这个Cube Map叫做Light Probe。
对于Lambert表面,其光照强度只和法线n和光照方向l相关,所以给定一个Light Probe,可以计算出所有可能的法线方向的光照,然后存储到一个Cube Map里,渲染时,只需要使用法线n去这个Cube Map里索引就能得到Environment Lighting,这个存储着光照的Cube Map就叫Irradiance Map。计算的伪代码如下:
diffuseConvolution(outputEnvironmentMap, inputEnvironmentMap) {for_all {T0: outputEnvironmentMap}sum = 0N = envMap_direction(T0)for_all {T1: inputEnvironmentMap}L = envMap_direction(T1)I = inputEnvironmentMap[T1]sum += max(0, dot(L, N)) * IT0 = sum return outputEnvironmentMap }
对于每一个法线n都需要去遍历所有的光线方向,算法复杂度为O(NM),N为Light Probe的大小,M为Irradiance Map的大小。
- Spherical Harmonics
由于Diffuse光照本身是变化很缓慢的低频数据,所以可以使用SH来加速计算。把算法分为两步:
1. 把Light Probe投影到SH上,求解出SH系数存储下来。
2. 将Light Probe的SH和Diffuse Transfer的SH做卷积即可求出Irradiance Map。
具体做法如下:
//将LightProbe投影到SH上
这篇关于使用Compute Shader加速Irradiance Environment Map的计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!