文章

Learn OpenGL Summary

对 LearnOpenGL 下的内容进行一个总结

HBAO: 对于图像上每个像素点,建立一个水平和垂直的直角坐标轴,给这个坐标轴应用一个微小的随机旋转,朝坐标轴的四个方向各步进六步,每个方向计算出六个采样点的局部 AO, 取出各个方向上的局部最大 AO,将这些局部最大 AO 相加求得平均值,限制到 [0, 1] 范围内之后再从 1 中减去它就得到当前像素的 AO 值。局部 AO 可通过计算当前像素点在视图空间中对应片段上的法线和样本点与当前像素点在视图空间中的差向量之间的点积,再乘以基于距离的权重求得。

HDR:默认情况下颜色值在存储到颜色缓冲时,会被限制在 [0, 1] 的范围内,当以 RGBA16F 等格式设置颜色缓冲的内部格式时,颜色缓冲可以存储超过 [0, 1] 范围的颜色值,从而在渲染场景时可生成 HDR 图像。有了 HDR 图像,可再通过色调映射算法将 HDR 图像映射到 LDR 图像,最后显示在 LDR 显示器上。

Bloom: 使用 MRT 技术,在渲染场景时生成一张场景的 HDR 图像和一张只包含亮光区域的图像,对亮光区域图像进行高斯模糊后再合成到场景的 HDR 图像上,然后再将合成的图像转换成 LDR 图像,就形成了一张包含泛光的图像。提取仅包含亮光区域的图像时需要确定哪些像素颜色超过了阙值,可使用 L = 0.2126R + 0.7152G + 0.0722B 将线性 RGB 三元组转换为亮度值,以亮度值来做判断,亮度值超过某一阙值的像素,可将其视为包含在亮光区域内。

ShadowMapping: 首先,执行一个 Depth-Pre Pass, 在光源视角下生成一幅场景的深度图。然后执行一个 Lighting Pass,像往常一样在摄像机视角下渲染场景,在判断当前渲染的片段是否属于阴影点时,将该片段坐标位置转换到光源视图空间中,计算光源视角下该片段在视口上的坐标,利用这个坐标位置去深度图中采样与之对应的光源视角下最近可见物体片段的深度,比较两者深度,就可判断片段是否属于阴影点。

Pick: 使用颜色缓冲实现拾取。pick pass 和 render pass 类似,但进行了简化,例如关闭了天空盒、大气和太阳,因为它们是不可拾取的。首先在对象创建更新的时候为每个拾取对象创建了唯一的颜色 ID,将这个 ID 和拾取对象进行关联,然后在拾取时执行 pick pass 中,根据拾取点位置创建一个剔除体,对渲染对象列表中拾取对象范围之外的其他对象进行剔除,其次使用与之对应的颜色 ID 对渲染对象列表中的对象进行绘制并写入拾取帧缓冲。最后使用 readPixels 读出拾取位置的屏幕颜色,在 ID 关联拾取对象的关系图中检索,并返回拾取的对象。

本文由作者按照 CC BY 4.0 进行授权