高大上的延时渲染技术 DeferredShading

MetalCore 8/9/2017

这几天尝试在 metalcore 中实现延时渲染,有了点进展,也明白了延时渲染技术到底是个怎么回事。

内容慢慢写,先上几张图

色彩图
![](img/29ad5_deferredRender.jpg)

### 法线图
![](img/29ad5_deferredRender_0.jpg)
在世界坐标系中计算光照会比较方便,所以用一张纹理来保存法线。保存世界坐标系的法线需要 xyz 三个数值,如果用一张RGBA的纹理来存储,就会多出一个字节,来留作它用。当然也可以将法线转换到视图空间,这样只要保存x和y两个值,z值可以在计算光照时,根据xy值计算出来。原理在于视图空间记录下的法线都是面向观察者的,背面不需要渲染,所以可以确定平方根的符号。这样一来,节省了一个字节,可以用来干点别的。

### 材质参数图
![](img/29ad5_deferredRender_1.jpg)
材质参数就是对一个物体表面的反光特性的数值化描述,包含漫反射强度、高光强度、高光硬度、镜面反射强度、表面粗糙度、发光强度等等。但一张纹理没法保存超过4个数值,所以需要忽略部分参数。具体忽略哪些,这个要看光照计算的算法了。刚刚在法线图中节省下来的两个字节,可以用上了。

### 深度图
![](img/29ad5_deferredRender_2.jpg)
这个不用说了,正常非延时渲染也是少不了的。用于遮挡和产生远处的雾化效果。其实还有一个重要的作用,就是我们需要利用深度值与像素坐标来还原出像素的世界坐标,用于光照计算和阴影计算。

最终合成图
![](img/29ad5_deferredRender_3.jpg)

  • {{comment.name}}{{comment.time | fDateTime}}

    • {{reply.name}}{{reply.time | fDateTime}}

Recent Articles

Recent Comments

{{comment.name}}{{comment.time | fDate}}

{{comment.content}}