阴影技术:Shadow Map 初探

  • 阴影技术:Shadow Map 初探_第1张图片

  • 阴影技术:Shadow Map 初探_第2张图片
    阴影技术:Shadow Map 初探_第3张图片
  • ShadowMap的原理

    • 光源和目标点之间的连线没有任何物体遮挡,则目标点没有在阴影中;
    • 光源和目标点之间的连线有物体遮挡,则目标点处在阴影中;
    • ShadowMap是一张2D纹理图,用来表述遮挡关系;
    • ShadowMap记录了以光源视角来看,各个可照射角度下离光源最近的物体与光源的距离;
  • ShadowMap的产生

    • 把光源位置作为视点渲染场景,在pixelShader把每像素与光源的距离写到RenderTarget中
    • 一定要打开深度测试,因为要保证:写到RenderTarget上的距离值肯定是(同一视角下)距离光源最近的物体与光源的距离。换句说就是不处在阴影中的点的距离值。
  • 分两个pass进行渲染

    • 第一个pass产生ShadowMap
    • 第二个pass正常渲染物体
  • 如何在第二个pass中判断有无阴影

    • vertexShader中,记录当前顶点对应于ShadowMap中的纹理坐标uv
    • pixelShader中取出uv对应的ShadowMap中的值Di,即:当前视角下,距离光源最近的物体与光源的距离
    • pixelShader中计算当前像素与光源的距离Dii,并且与Di进行比较,大于Di则有阴影。
  • 如何在第二个pass中取出顶点对应于ShadowMap的纹理坐标

    • 如同ShadowMap的产生:把光源位置作为视点,即把物体变换到光源对应的空间并进行透视投影,计算出顶点对应于整个屏幕空间的纹理坐标uv
    • 矩阵变换、透视投影等原理可见twinsen的blog:http://blog.csdn.net/popy007/article/category/640562
  • ShadowMap的优缺点

    • 优点:简单、易于实现。
    • 缺点:ShadowMap分辨率不高时,或灯光与物体隔得很近时,在边缘处会产生锯齿。

  • 代码地址https://github.com/spracle/RenderMonkeyShader/tree/master/shadowMap

你可能感兴趣的:(3D编程)