6

で説明されている手法を実装しようとしています: Compositing Images with Depth

アイデアは、既存のテクスチャ (画像から読み込まれた) を深度マスクとして使用して、基本的に 3D を偽造することです。

私が直面している問題は、glDrawPixels が OpenglES で利用できないことです。iPhoneで同じことを達成する方法はありますか?

4

1 に答える 1

7

深度バッファは、OpenGL ES で考えているよりもわかりにくくなっています。glDrawPixels が存在しないだけでなく、gl_FragDepth が GLSL から削除されました。そのため、色をプッシュする可能性があるため、カスタム フラグメント シェーダーを記述して深度バッファーに値をスプールすることはできません。

最も明白な解決策は、深度情報をテクスチャにパックし、カスタム フラグメント シェーダーを使用して、それが生成するフラグメントと、提供するテクスチャから検索したフラグメントとの深度比較を行うことです。生成されたフラグメントがより近い場合にのみ、処理を続行できます。通常の深度バッファはオクルージョンの他のケースをキャッチします。原理的には、フレームバッファ オブジェクトを使用して最初に深度テクスチャを作成し、完全なオン GPU ラウンド トリップを提供できますが、これは直接的には関係ありません。問題。

欠点は、描画に余分なテクスチャ ユニットが必要なことと、テクスチャが整数コンポーネントを使用することです。

編集: 例を単純にするために、すべての深度情報をテクスチャの赤チャンネルに詰め込んでいるとします。これにより、非常に精度の低い深度バッファーが得られますが、明確にするために、次のような簡単なフラグメント シェーダーを作成できます。

void main()
{
    // write a value to the depth map
    gl_FragColor = vec4(gl_FragCoord.w, 0.0, 0.0, 1.0);
}

赤チャンネルに深さを保存します。これで、古い深度テクスチャ エクステンションを部分的に再作成しました。近くにあるピクセルが明るい赤になり、遠くにあるピクセルが暗い赤になる画像ができあがります。あなたの質問では、実際にこのイメージをディスクからロードすると思います。

将来のフラグメント シェーダーでテクスチャを使用するには、次のようにします。

uniform sampler2D depthMap;

void main()
{
    // read a value from the depth map
    lowp vec3 colourFromDepthMap = texture2D(depthMap, gl_FragCoord.xy);

    // discard the current fragment if it is less close than the stored value
    if(colourFromDepthMap.r > gl_FragCoord.w) discard;

    ... set gl_FragColor appropriately otherwise ...
}

EDIT2:ここで、深さから RGBA 値へのよりスマートなマッピングを確認できます。そのドキュメントに直接結び付けるために、OES_depth_texture は iPad または第 3 世代の iPhone ではサポートされていません。私は他の場所で完全なテストを実行していません。

于 2011-01-04T17:06:04.880 に答える