【LearnOpenGL 学习笔记】高级光照
作者:互联网
文章目录
学习LearnOpenGL时记录的一些简单的笔记,教程网址为LearOpenGL CN
Gamma校正
显示器输入电压产生约为输入电压的2.2次幂的亮度,一般显示器gamma=2.2,对于(0,1)之间的rgb值,就是变暗了
校正方法:在最终的颜色输出上应用显示器gamma的倒数
gamma=2.2:sRGB颜色空间
HDR(High Dynamic Range)
大于1.0的颜色值也会被规范到1.0,导致场景中很亮的区域变成一片白色
使用浮点帧缓冲,如GL_RGB15F等,值可以超过1.0f
色调映射:把范围更大的颜色值转换到[0.0,1.0]
ReinHard色调映射
c o l o r = h d r C o l o r h d r C o l o r + 1.0 color=\frac{hdrColor}{hdrColor+1.0} color=hdrColor+1.0hdrColor
曝光
c o l o r = 1.0 − e − h d r C o l o r ⋅ e x p o s u r e color=1.0-e^{-hdrColor\cdot exposure} color=1.0−e−hdrColor⋅exposure
泛光(Bloom)
原理:提取亮色+模糊
HDR对Bloom的好处:亮色的阈值可以超过1.0,否则只能≤1.0,会导致光晕效果过重
延迟渲染
Forward管线的问题:对每个需要渲染的物体,都要对每个光源每个片段进行计算,而大部分片段着色器的输出都会被覆盖
延迟渲染的思路:把大部分计算量非常大的渲染defer到后期进行处理
first pass:渲染一遍场景,把几何信息存进G-Buffer(position、normal、albedo、specular…)
second pass:用G-Buffer进行光照计算
问题:占显存比较大,尤其是高精度的位置信息;只能用同一套光照算法;不支持混合
解决方法:结合defer和forward,先用defer渲染不透明物体,再用forward渲染透明物体,使用G-Buffer中的深度信息,就可以实现混合效果
光体积(light volume):计算光源的可达范围,仅当片段位于光源体积内时才计算光照,减少计算量
需要继续了解的:
-
延迟光照
-
切片式延迟着色法
法线贴图
每个fragment使用各自的法线,代替一个面上所有fragment使用同一个法线的技术。这样模型的面数不用增加,只通过法线贴图增加大量细节。
法线在[-1,1]之间,而rgb颜色值在[0,1]之间,通过公式映射:
r
g
b
_
n
o
r
m
a
l
=
n
o
r
m
a
l
×
0.5
+
0.5
rgb\_normal=normal\times 0.5 + 0.5
rgb_normal=normal×0.5+0.5
切线空间:
x轴:切线 (1,0,0) ->(1,0.5,0.5) 红色
z轴:模型法线 (0,0,1) -> (0.5,0.5,1) 蓝色
y轴: 副切线
使用切线空间的好处:不受表面实际朝向的影响
法线贴图上大部分位置都是蓝色,也就是法线指向z轴,表示法线就是模型法线,而法线贴图上是红色或绿色的地方表示此处法线与模型法线垂直,就是凹凸出来的地方。
标签:贴图,法线,1.0,渲染,0.5,笔记,hdrColor,LearnOpenGL,光照 来源: https://blog.csdn.net/weixin_42489848/article/details/121725257