2

これは簡単な質問かもしれません。GLSLの初心者として、私はむしろここで質問したいと思います。これで、頂点シェーダーで、次の方法でワールド座標系の位置を取得できます。

    gl_Position = ftransform();
    posWorld = gl_ModelViewMatrix * gl_Vertex;

問題は、すべての頂点の中でposWorldの最大/最小値を取得できるかどうかです。頂点の深さの範囲を取得できるようにしますが、深さバッファーの範囲は取得できません。

これが不可能な場合、ワールド座標系で近距離/遠距離平面のz値を取得するにはどうすればよいですか?

敬具、

ジャン

4

2 に答える 2

2

はい、OpenGLで可能です。GPUでオブジェクトのバウンディングボックスを計算するために同様の手法を実行しています。手順は次のとおりです。

  1. サイズ1x1タイプのRGBA_32Fのレンダーバッファを独自のFBOに配置します。レンダリングターゲットとして設定します(深度/ステンシルなし、単一のカラープレーンのみ)。より大きなテクスチャのピクセルにすることができます。その場合、ビューポートを正しく設定する必要があります。
  2. 基本値でクリアします。'min'の場合は巨大な数値になり、'max'の場合は負の巨大になります。
  3. 係数(1,1)に対応してブレンド関数'min'または'max'を設定します。
  4. (0,0,0,1)座標を持つポイントを生成するシェーダーを使用してメッシュを描画します。元の頂点ワールド位置を含む色を出力します。

ここからさらに最適化することができます。たとえば、ジオメトリシェーダーを利用し、出力ピクセルの1つの位置を否定することで、1回の描画呼び出しで「min」と「max」の両方を取得できます。

于 2011-09-24T00:12:49.760 に答える
1

私の知る限り、これは並列還元に基づくアルゴリズムを使用して手動で行う必要があると思います。すでにこれを行っているOpenGLまたはGLSL関数が存在するかどうかを誰かに確認してもらいたい。

一方、フラグメントシェーダー( http://www.opengl.org/wiki/GLSL_Predefined_Variables#Fragment_shader_uniforms )内の正規化されたニア/ファープレーンにアクセスできます。
そして、いくつかの均一な変数の助けを借りて、あなたは世界を遠く/近くに得ることができます。

于 2011-09-22T16:43:23.533 に答える