[翻译]延迟着色(1)
延迟着色是一种对3d场景进行后期照明的技术,这种技术突破了以往渲染系统支持多重动态光源时,效率以及各种性能急剧下降的的限制。从而使得一个3d场景可以支持成百上千个动态光源的效果。
它的技术思路主要将3d场景的几何光照信息(位置、法线、材质信息)渲染到render target上,把它们从世界的三维空间转变成屏幕的颜色空间,作为光照计算时的输入,接着,对每一个光源,使用这些信息输入来进行计算生成一帧,然后把这样的一帧(render target)合成到结果的帧缓存上,这样当遍历完所有的光源,计算就完毕了,帧缓存上的图像就是最后的渲染结果。
概述:延迟着色的优势
1. 它能让你在绘制几何图形的时候不需要为任何光照方面的问题所担忧。
2. 使用多个渲染流程将像素的多种格式,比如空间坐标,法线渲染到各自得目标缓冲中去。
3. 利用第2点中提到的渲染数据对像素进行着色计算,仿佛在2D图形空间中进行绘制一样。
传统单通路光照(影响物体的所有光照在一个shader pass中完成)有哪些特点?
1. 光源数量极少的场景中传统渲染方式能工作得很好,比如只有太阳光的野外场景。
2. 在光源很多的时候,非常难于对光照进行管理。
3. 由于所有光照都在一个shader里完成,所以shader指令数目一个不小心就超过了GPU限制。
传统多通路光照(指每个光源对物体的影响是分开pass中完成的)有哪些特点?
1. 复杂度太高,计算完所有光照需要 物体数目 × 光源数目 个pass。
2. 不论是按物体,还是按光源进行分批都是相当麻烦的。
3. 理论上讲,光源应该按它们的作用范围对场景进行分割管理,但如果按多通路计算光照,动态光源将相当难处理。
延迟着色有哪些特点?
For each object:
Render to multiple targets
For each light:
Applylight as a 2D postprocess
1. 复杂度适中,需要物体数目 + 光源数目 个pass。
2. 易于分批计算。
3. 多个小范围光源和一个大范围光源计算量差不多(因为每象素影响光源数一样)。
我们需要哪些渲染目标缓冲?
1. 我们需要如下几何渲染结果:
-空间坐标
-法线数据
-材质参数(漫反射颜色,自发光颜色,高光颜色及高光衰减系数等)
2.延迟着色不是适用于需要特别多输入参数的光照计算(比如球面调和函数的光照计算)。
“胖的”帧缓冲
各种帧缓冲的格式:
–空间坐标 A32B32G32R32F
–法线 A16B16G16R16F
–漫反射颜色 A8R8G8B8
–材质参数 A8R8G8B8
每个像素占用256字节,在不使用抗锯齿的情况下,1024×768要占用24M的空间。目前现在的硬件也不支持多个不同格式的帧缓冲。
优化帧缓冲尺寸
–使用A2R10B10G10格式来存储法线。
–可以利用调色板机制来存储材质属性,利用索引来取得所要的值。
–完全没有必要用一个VECTOR3在存储像素的空间位置,因为我们知道相机的空间位置,并且知道像素在屏幕空间中的坐标,这样我们只需要还知道相机到像素的距离,就可以求得像素的空间3D坐标了。
我的帧缓存格式的选择
•128 bits per pixel=12 meg @ 1024x768:
–Z深度 R32F
–法线和散射 A2R10G10B10
–漫反射颜色 + 自发光颜色 A8R8G8B8
–其他材质参数 A8R8G8B8
我的材质参数有:高光强度,高光系数,遮挡因子和阴影数量,我还使用了法线缓冲alpha通道中的2bit来控制次表面散射。