OpenGL(十九) 阴影 通过ShadowMap的shader实现


阴影 可以使角色与地面的关系更加明确。本文主要介绍如何通过 ShadowMap 在OpenGL中实现阴影 。

核心原理

Shadow Map的基本思想:通过LightView画一张DepthMap,然后Camera View渲场景的时候,把Pixel坐标变换到Light Space,比较Depth即可(Pixel的Depth大于Shadow Map的Depth即在阴影区)。也可以直接是ScreenSpaceDepthMapPost-processing

阴影 生成需要三个步骤:

  1. 在角色正上方照出一张深度图。
  2. 视线方向的模型绘制点,在上方摄像机视口的Z值与深度图相同位置的Z值进行比较,如果比深度图中的值小则为亮区,反之需要绘制阴影。
  3. 将颜色物体颜色与阴影绘制在一起。

实现

深度图其实就是一张灰度图片,可以简单的将摄像机放到物体正上方,绘制出常规效果之后,只提取R通道。另外通过pow可以加深depthValue。

有了shadowmap,接下来需要在比较阴影区域的深度值,可以通过

总结

经过上述步骤可以将 阴影 绘制出来。如果希望阴影能降低锯齿,可以将深度图进行高斯模糊,或使用PCF(Percentage Closer Filtering)进行柔化。

本文出自 松阳论道 转载必须注明出处

http://blog.songyang.net/433.html

说点什么吧...

电子邮件地址不会被公开。 必填项已用*标注