陰影技術:Shadow Map 初探



  • 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分辨率不高時,或燈光與物體隔得很近時,在邊緣處會產生鋸齒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章