draw_texture拡張機能を使用して、OpenGLESで深度テストを正しく機能させようとしています。この拡張機能を使用してレンダリングすると、「通常の」z座標が機能しないことに早くから気づきました。これは、OpenGL OES描画テクスチャページに示されているように、深度バッファ内の実際のz位置ではなく、0と1の間の比率としてZ座標を効果的に使用する拡張によるものです。
Zsは、次のようにウィンドウの深さZwにマップされます。
{ n, if z <= 0 Zw = { f, if z >= 1 { n + z * (f - n), otherwise where <n> and <f> are the near and far values of DEPTH_RANGE.
OpenGLの透明性に関するFAQページで次のことを読みました。
アプリケーションでデプスバッファリングを使用する場合は、プリミティブをレンダリングする順序に注意する必要があります。完全に不透明なプリミティブを最初にレンダリングし、次に部分的に不透明なプリミティブを後ろから前の順序でレンダリングする必要があります。プリミティブをこの順序でレンダリングしないと、部分的に不透明なプリミティブを通して表示されるプリミティブは、深度テストを完全に失う可能性があります。
これは私の問題に私を連れて行きます。私は2つの正方形を持っています。両方とも64x64です。それらは円でテクスチャリングされています。「上の」正方形は、そのように下の正方形から少し下に配置されます。
___________
| .____. |
| / \ |
|_|______|_|
| .____. |
| / \ |
| | s | |
| \____/ t|
|__________|
円のテクスチャは、円を形成する単色であり、次に完全に透明な周囲の領域(t)です。
OpenGLがレンダリングすると、下の正方形は深度テストに失敗し、その上のピクセルは透明ですが描画されないため、画像全体ではなく、下のレイヤーから半円の効果が得られます。
BAD GOOD
___________ ___________
| .____. | | .____. |
| / \ | | / \ |
|_|______|_| |_| |_|
| .____. | | \.____./ |
| / \ | | / \ |
| | | | | | | |
| \____/ | | \____/ |
|__________| |__________|
どうすればこれを防ぐことができますか?