Post

Light Pre-pass Render

Light Pre-pass Render

简介

Light Pre-pass 渲染器 [0] 是延迟渲染的一种修改版。 渲染步骤大致如下:

  • 渲染场景法线与深度到MRT中
  • 计算Light Buffer
  • 从Light Buffer中获得光照参数,重建着色方程
  • 进行Forward Rendering,排序由前至后

此方法的优点有:

  • 更小的G-Buffer
  • 支持MSAA
  • 支持没有MRT的设备

光照方程

常用的就是Phong [1] 与Blinn-Phong [2] 了,先复习一下其原理:

phong

NameDetailNameDetail
N平面法线L光的方向
V视角方向RL对N镜像
HL + V  

Phong模型

phong model

  • N与L的点积,控制漫反射分量
  • R与V的点积的n次方,控制镜面反射分量,n代表shininess
NameDetailNameDetail
KColorAttAttenuation
aAmbientsSpecular
ddiffusenshininess
ITIntensitylLight

L对N的镜像R的计算:

reflect

Blinn-Phong模型

blinn phong model

  • N与L的点积,控制漫反射分量
  • N与H的点积的n次方,控制镜面反射分量,n代表shininess

渲染器设计

属于灯光的参数:

1
2
3
4
5
light
{
	color, 
	shininess/power
}

属于材质的参数:

1
2
3
4
5
6
7
8
9
10
material 
{
	specular_color, 
	specular_intensity, 

	diffuse_color, 
	diffuse_intensity,

	shininess/power
}

我们需要重建的光照方程,使用Blinn-Phong光照模型:

1
2
3
4
color = ambient + shadow * attenuation * (
	mat_diff * diff_intensity * light_color * N * L + 
	mat_spec * spec_intensity * ((N * H)^n)^m
)
NameDetailNameDetail
attenuation控制灯光的衰减intensity控制光照的强度
n灯光的亮度m材质的亮度

光照方程中,与灯光相关参数:

  • N * L
  • light.color
  • (N * H) ^ n
  • attenuation

我们将其存储到Light Buffer中,用于后续渲染中对光照方程的重建:

1
2
3
light_buffer.rgb = light_color.rgb * N * L * attenuation
light_buffer.a = (N * H)^n * N * L * attenuation
N * L * attenuation

若需要重建高光反射分量,则共需要两个Render Target。

在这里,我们可以转换 N * L * attenuation 到 luminance [3],这两个值非常接近:

1
2
luminance = N * L * attenuation 
	= (0.2126 * R + 0.7152 * G + 0.0722 * B)

这样我们就可以重建高光反射分量,并且仅需要一个Render Target:

1
2
(N * H)^n = light_buffer.a / luminance
	= ((N * H)^n * N * L * attenuation) / (N * L * attenuation);

附录

[0] Wolfgang Engel. Light Pre-Pass Renderer. Diary of a Graphics Programmer.

[1] Wikipedia. Phong Reflection Model.

[2] Wikipedia. Blinn Phong Shading Model.

[3] Wolfgang Engel. Light Pre-Pass More Blood. Diary of a Graphics Programmer.

This post is licensed under CC BY 4.0 by the author.