2

動作するGバッファ(色、法線、深度)があり、各スポットライトについて、ライトの観点からの深度マップがあります。問題はライティングマップフェーズにあり、動作させることができません。ここで何が問題なのか指摘していただけますか?

プロセスの私の「理解」は次のとおりです。

1. Pass the G-buffer depth map to the lighting shader
2. Pass the light's depth map to the lighting shader
3. For each pixel in the G-buffer depth map:
    3.1. Get the depth value from the texture
    3.2. Convert the X and Y coordinates from texture space to clip space
        3.2.1. pos.x = texcoord.x * 2.0 - 1.0;
        3.2.2. pos.y = -(texcoord.y * 2.0 - 1.0);
    3.3. Set pos.w to 1
    3.4. Multiply the position by inverse view projection matrix to get the world space coordinate
    3.5. Divide the new coordinates by w to "correct" the coords
    3.6. Multiply the coordinates by light's view matrix
    3.7. Change the coordinates from clip space to texture space
    3.8. Compare the Z value of the pixel to the depth value in the light's depth map
    3.9. If pos.z > depthmap.z, the pixel is in shadow
4

1 に答える 1

1

プロセスは実際には反対です。テクスチャ座標をクリップスペースに変換しませんが、座標をクリップスペースからテクスチャに変換します。これを機能させるには、ライトカメラとプロジェクションをフラグメントシェーダーに渡す必要があります(少なくともOpenGLES 2.0では、頂点シェーダーからフラグメントシェーダーに位置を渡す必要があります。OpenGL3.3についてはわかりません)。

  • 位置にカメラと投影を掛けると、ライトのビューで位置がわかります。
  • xyzをwで割ると、ライトビューのクリップスペースでの位置がわかります。
  • xとyに0.5を掛け、0.5を加えると、シャドウマップのUV座標が得られます。

これで、uvのシャドウマップから深度を読み取り、ピクセルの深度と比較できます。

于 2013-02-24T19:22:22.617 に答える