1

シェーダーに関してはかなり新しいので、ここでばかげたことをしている場合はご容赦ください。:)

iOS で opengl ES 2.0 を使用してシーンの深度バッファをテクスチャにレンダリングしようとしていますが、ディスプレイに表示されるポリゴンの密度が比較的高いモデルでない限り、完全に正確な結果が得られないようです。

したがって、たとえば、4 つの頂点のみで構成される大きなプレーンをレンダリングすると、非常に不正確な結果が得られますが、このプレーンを分割すると、分割ごとに結果がより正確になり、最終的に正しくレンダリングされた深度バッファーが得られます。

これは、アフィンとパースペクティブ プロジェクション テクスチャ マッピングの問題について多くのことを思い出させてくれます。これを修正するには、何らかの方法で ".w" コンポーネントをいじる必要があると思います。しかし、「さまざまな」変数はすでにこれを考慮に入れるべきだと思ったので、ここで少し迷っています。

これは私の頂点とフラグメント シェーダーです。

[vert]
uniform mat4 uMVPMatrix;
attribute vec4 aPosition; 
varying float objectDepth;
void main()
{
    gl_Position=uMVPMatrix * aPosition;
    objectDepth=gl_Position.z;
}

[frag]
precision mediump float;
varying float objectDepth;
void main()
{
    //Divide by scene clip range, set to a constant 200 here
    float grayscale=objectDepth/200.0;
    gl_FragColor = vec4(grayscale,grayscale,grayscale,1.0);
}

このシェーダは、私が使用している方法を強調するために大幅に簡略化されていることに注意してください。肉眼ではほとんどの場合うまく機能しているように見えますが、実際には 32 ビット テクスチャにレンダリングしています (フロートを ARGB にパックすることによって)。後で処理するために非常に高い精度が必要です。そうしないと、アーティファクトが目立ちます。

ポリゴン数を増やすことでかなり高い精度を達成できますが、それによってフレームレートが大幅に低下するので、もっと良い方法はありますか?

4

2 に答える 2

2

zをw成分で割る必要があります。

于 2011-12-21T14:04:00.547 に答える
0

これは非常に単純です。深さは線形ではないため、z に線形補間を使用することはできません。z の代わりに 1/z を補間すると、非常に簡単に解決できます。rasmus によって提案されているとおりに、いくつかの w 数学を実行することもできます。座標補間の詳細については、http://www.luki.webzdarma.cz/eng_05_en.htm (単純なソフトウェア レンダラーの実装に関するページ)を参照してください。

于 2012-01-11T20:58:43.877 に答える