現在、2Dゲームのブレンドと深度テストをオンにしています。テクスチャを描画するとき、「上部」テクスチャは、下部テクスチャが交差する場合、それらの一部を削除します。明らかに、テクスチャの透明なピクセルは深度テストで考慮され、交差する場合は、描画された下部テクスチャのすべての色がクリアされます。さらに、アルファブレンディングが正しくレンダリングされません。深度テストに透明ピクセルを含めないようにOpenGLに指示できる関数はありますか?
4 に答える
glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_EQUAL, 1.0f );
これにより、完全に不透明でないアルファを持つすべてのピクセルが破棄されます。これらのピクセルは、Z バッファにレンダリングされません。ただし、これはさまざまな Z-Buffer パイプラインの最適化に影響を与えるため、深刻な速度低下を引き起こす可能性があります。本当に持っている場合にのみ使用してください。
シェーダーを使用している場合は、ブレンドを無効にして、アルファ0のピクセルを破棄してみてください。
if(texColor.w == 0.0)
discard;
いいえ、できません。これは、すべてのハードウェア深度テストに当てはまります。
GL (フルまたは ES -- および D3D) はすべて同じモデルを持ち、ポリゴンを指定した順序でペイントします。ポリゴン A をポリゴン B の前に描画し、論理的にポリゴン A がポリゴン B の前にある場合、ポリゴン B は描画されません (深度テストのおかげです)。
解決策は、現在のビューの原点から最も遠いものから最も近いものへとポリゴンを描画することです。幸いなことに、2D ゲームでは、これは単純な並べ替えである必要があります (あまり頻繁に行う必要はないでしょう)。
3D ゲームでは、BSP がこの問題の基本的な解決策です。
どのタイプのブレンドを使用していますか?
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
アルファが 0 のフラグメントが深度バッファに書き込まれないようにする必要があります。