2011-07-12 19 views
4

3Dフィルタリングアプリケーションのカメラビューからデプスバッファを取得したいと思います。現在、深度コンポーネントを取得するためにglReadPixelsを使用しています。 [0,1]の値の代わりに、私は深度バッファの真の値、または世界の座標におけるカメラへの真の距離が必要です。OpenGL readPixelsを使用した真の深度値

深度値をGL_DEPTH_BIASとGL_DEPTH_SCALEで変換しようとしましたが、うまくいきませんでした。

glReadPixels(0, 0, width_, height_, GL_DEPTH_COMPONENT, GL_FLOAT, depth_buffer); 
glGetDoublev(GL_DEPTH_BIAS, &depth_bias); // Returns 0.0 
glGetDoublev(GL_DEPTH_SCALE, &depth_scale); // Returns 1.0 

は、私は、これはGetting the true z value from the depth bufferに似て実現するが、私はないシェーダで、メインメモリに深度値を取得したいのですが。

答えて

2

以前のようにZバッファから正規化された深度値を取得した後にgluUnproject()を試してみてください。モデルビュー行列、投影行列、およびビューポートの値を指定する必要があります。この値はglGetDoublev()glGetIntegerv()で取得できます。

+0

ありがとう、これはうまくいきました。私はgluUnproject()への呼び出しにアイデンティティモデルのビュー行列を使用しました。 –

2

[0,1]の代わりに、デプスバッファーの真の値、または世界座標でのカメラまでの真の距離が必要です。

奥行きバッファには、カメラからの距離値は含まれません。深度値は、カメラの平面に対する垂直距離です。したがって、実際にカメラまでの半径距離が必要な場合は、それらをシェーダで計算してバッファに書き込む必要があります。デプスバッファーは助けにならないでしょう。

しかし、シェーダではなく、メインメモリに深度値を取得したいと思います。

次に、シェーダではなくC/C++(または何でも)のコードを除いて、これらのシェーダの動作を行います。数学はどちらとも同じです。深度バッファの各値をループして変換するだけです。

関連する問題