demo
泛光
- 泛光:光芒从光源向四周发散。给观众一种这些光源或明亮的区域非常亮的错觉,有了HDR之后再实现泛光就更简单了
- 过程:正常渲染场景至HDR颜色缓冲->提取所有超出一定亮度的fragment->将这个超过一定亮度阈限的纹理进行模糊处理->添加到原来的HDR场景纹理之上
- //
MRT:
- 多渲染目标MRT(Multiple Render Targets):指定多个像素着色器输出,像素着色器的输出前,我们指定一个布局location标识符,这样我们便可控制一个像素着色器写入到哪个颜色缓冲:必要条件:有多个颜色附件附加到了当前绑定的帧缓冲对象上。
- glDrawBuffers(index,附件枚举enum)需要显式告知OpenGL我们正在通过glDrawBuffers渲染到多个颜色缓冲,否则OpenGL只会渲染到帧缓冲的第一个颜色附件,而忽略所有其他的。
- //
提取亮色:
- 正常渲染到location1作为scene的输出,通过点积计算计算亮度,如果超过了一定阈限,就同时输出到location2颜色缓冲
- //
高斯模糊:
- 从周围像素采样,近处的样本拥有最大的优先权,权重随着距离变大逐渐减小
- 性能优化:卷积核32×32,每个fragment从一个纹理中采样1024次!
- 建立两个帧缓冲,把二维方程分解为两个更小的方程:一个描述水平权重,另一个描述垂直权重。,我们实现像乒乓球一样的帧缓冲来实现高斯模糊,一个帧缓冲计算后,绑定另一个的纹理附件(首次绑定HDR普通帧缓冲的第2个颜色纹理附件,之后在pingpong纹理互传)
- //
混合:
- 现在我们有scene的渲染纹理,光的模糊纹理,需要混合在一起,新的shader接收2个simple Texture,根据HDR色调映射,计算final的Quad 的color