現在、次の GLSL コードを使用して、後処理の被写界深度シェーダーの深度テクスチャから読み取っています。
vec4 depthSample = texture2D(sDepthTexture, tcScreen);
float depth = depthSample.x * 255.0 / 256.0 +
depthSample.y * 255.0 / 65536.0 +
depthSample.z * 255.0 / 16777216.0;
次に、深さの値を近距離と遠距離の平面距離に基づいてビュー空間距離に変換します。
float zDistance = (zNear * zFar) / (zFar - depth * (zFar - zNear));
これはすべてかなりうまくいくようですが、別zNear
のzFar
値を必要とせずに現在の射影行列のみに基づいて上記の計算を行う方法を知りたいと思っています。
私の最初の試み(vec4(tcscreen.x, tcScreen.y, depth, 1.0) * 2.0 - 1.0)
では、射影行列の逆数を掛け、結果を で割り、結果の値を距離としてw
取りましたz
が、うまくいかなかったようです。ここで正しいアプローチは何ですか?
また、斜めの錐台クリッピングを使用してニアプレーンを選択したクリッピングプレーンにシフトすると、ニアプレーンの距離がピクセルごとに異なる可能性がありますか? もしそうなら、深度テクスチャからの距離を計算するシェーダーはこのケースを認識する必要があり、平面に近い距離が一定であると仮定しないことを意味しますか?
ありがとう!