1

シーンからデプスバッファを収集します。ただし、カメラとシーンのオブジェクトが同じ位置にあり、カメラが回転するだけの場合、デプスバッファは異なる結果を収集します。たとえば、画面の側面に表示されるオブジェクトは、中央に表示されるオブジェクトとは異なる深度になります。これはOpenGLの機能かもしれませんが、それでも、どうすればこれを修正できますか?何を考慮に入れるべきですか?

次の関数を使用して深度を線形化します。

float linearize(float depth) {
    float zNear = 0.1;
    float zFar = 100.0;

    return (2.0 * zNear) / (zFar + zNear - depth * (zFar - zNear));
}

大丈夫だと思われる近距離と遠距離の値を確認しました。

4

2 に答える 2

1

はい、これは予想されることです。平面に近い遠近法は一種の投影面であり、深さの値は深さ平面に垂直な点の距離です。ここで、「カメラ」を回転させるとどうなるかを考えてみてください (もちろん、OpenGL にはカメラはありません)。垂直距離は、位相シフトが追加された回転角度の正弦によって変化します。

ピクセルから視点までの距離を実際に測定したい場合は、深度バッファを使用せず、原点までの頂点距離を渡す頂点シェーダーを作成するのが最善の方法です (組み込み関数length) 。スカラーをフラグメント シェーダーに渡し、フラグメント シェーダーはこれを単一チャネルのフレームバッファー オブジェクト出力に書き込みます。

于 2012-12-28T20:35:45.403 に答える
1

OpenGL には「カメラ」のようなものはありません。モデルビュー マトリックスを変更する (「カメラ」を回転させる) と、オブジェクトを画面に近づけたり近づけたりすることを実際に考えることができます。深度は各頂点 (フラグメント) の正規化された変換された z として計算されるため、レンダリングされた深度値が異なるのはそのためです。変換後は、オブジェクトの位置だけでなく「カメラ」の位置も考慮する必要があるため、モデルビュー マトリックスを変更すると、結果の z 値が変更されます。

于 2012-12-28T20:32:07.100 に答える