基準: OpenGL とシェーダー (GLSL) を使用しており、最新の手法を維持しようとしています (たとえば、非推奨の概念から離れようとしています)。
非常に一般的な意味での私の質問は次のとおりです。詳細については以下を参照してください。
- シェーダーでは、GL_BLEND の使用時に見られる z オーダーの透明度の問題を解消するのに役立つカスタム ブレンディングを行うことができますか?
- ある種のフラグを「手動で」渡すことなく、描画されているプリミティブのタイプをシェーダーが知る方法はありますか?
- シェーダーが頂点を「無視」または「破棄」する方法はありますか (特にポイントを描画する場合)?
背景: 私のアプリケーションは、オルソ投影で線で接続された点を描画します (頂点は投影でさまざまな深さを持ちます)。プロジェクトでシェーダーを使い始めたのはつい最近のことです (非推奨の概念から離れようとしています)。標準的なブレンディングには、アルファ テストと深度テストの順序付けの問題があることを理解しています。基本的に、高い z レベルの「半透明」ピクセルが最初に描画される場合 (したがって、低い z レベルでそのピクセルに既に描画されている色とブレンドします)、次に、不透明なオブジェクトがそのピクセルで描画されますが、より低い z レベルでは深度テストにより、「より高い」z レベルで既に描画されているピクセルを変更できないため、ブレンドの問題が発生します。これを克服するには、最初に不透明なアイテムを描画し、次に半透明のアイテムを z の昇順で描画する必要があります。
さらに、速度と利便性のために、各頂点の情報を (いくつかの均一な変数と共に) シェーダーに渡し、シェーダーはその情報を使用して、特別な注意が必要な頂点のサブセットを見つけます。アプリ自体で同様の一連のロジックを実行しないと (そして動作が遅くなる)、アプリオリにそれが vericies のどのサブセットであるかを知ることはできません。したがって、すべての頂点をシェーダーに送信します。ただし、「ポイント」を描画するときは、シェーダーが決定するサブセットにないすべての頂点をシェーダーに無視させたいと思います。アルファをゼロに設定し、GL コンテキストでアルファ関数を使用して、たとえば 0.01 未満のアルファで何も描画しないようにすることで、効果を得ることができると思います。ただし、シェーダーが「この頂点を無視するだけ」と言うためのより良い、またはより「正しい」gsl 方法はありますか?