其他分享
首页 > 其他分享> > 【LearnOpenGL 学习笔记】高级光照

【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