LapuEngine·Shadow

基于OpenGL的图形渲染器(及其他...

概括

阴影的形成原理即当一个光源的光线由于其他物体的阻挡不能到达一个物体的表面时,这个物体就在阴影中了。

阴影的实现还没有完美的算法。游戏中常用的阴影技术有阴影映射(shadow mapping)。

深度测试

OpenGL中提供深度缓冲(depth buffer),存储屏幕空间的深度值。启用深度测试后,OpenGL 测试深度缓冲区内的深度值。OpenGL 执行深度测试的时候,如果此测试通过,深度缓冲内的值将被设为新的深度值。如果深度测试失败,则丢弃该片段。

当两个物体的缓冲区重叠时(或者说距离太近),因无法判断深度顺序,会发生深度冲突。解决办法有①人工制造物体间偏移②提升深度缓冲精度(一定程度上牺牲性能)

阴影映射

以光的位置为视角进行渲染,视角内的物体都会被点亮,视角外的物体即在阴影中。

以上图定向光照下的物体为例,当想要渲染P点时,如何判断他是否在阴影中?

当使用一个来自光源的视图和投影矩阵来渲染场景时,可据此创建深度图。设视图和投影矩阵的组合变换为T变换。首先使用T将P变换到光源的坐标空间中,在光源空间中,P点的z坐标即等于深度值,根据光源获得可见深度——C点,可见P点深度大于C点,即P位于阴影中。

投影矩阵的大小即决定了阴影的影响效果范围…全场效果按理说得有无限大的矩阵

glm::lookat函数

bug

啊这…

LapuEngine记录

参考

  1. simple procedural skybox

  2. Learnopengl-cubemap中文版