2016-03-23 7 views
1

現在、同じタイプのオブジェクトを処理する2つのシェーダーがありますが、異なる出力を生成します。ドローシェーダのいくつかのフラグメント位置に書き込みますが、他のフラグメント位置に書き込まないでください

出力:選択シェーダの

layout(location = 0) out vec4 outColor; 

出力:

layout(location = 0) out vec4 selectionInfo0; 
layout(location = 1) out ivec4 selectionInfo1; 

私は一緒にシェーダを組み合わせて検討していますメンテナンスの明確さと使いやすさのために(私のアプリケーションでこれら2など) (なぜ2つのシェーダーを編集できるのか?)統合されたシェーダの

出力:

layout(location = 0) out vec4 outColor; 
layout(location = 1) out vec4 selectionInfo0; 
layout(location = 2) out ivec4 selectionInfo1; 

このスキームの下では、私は、フラグメントはに書き込む必要かを決定し、均一に設定します。

一部のフラグメントの場所に書き込むことはできますか?

void main() 
{ 
    if(Mode == 1){ 
     outColor = vec4(1, 0, 0, 1); 
    } 
    else { 
     selectionInfo0 = vec4(0.1, 0.2, 0.3, 0.4); 
     selectionInfo1 = ivec4(1, 2, 3, 4); 
    } 
} 

これは正当なアプローチですか?何か心配すべきことはありますか?

+0

あなたが編集した内容を見て、この方法は問題ありません。 *しかし*、シェーダコードで分岐について言及したことをまだ見ています。遅いですから、もしあなたが1つのシェイダーをすべてのソリューションにしたいので、if文を追加し始めたらスピードの心配は最低限に留めてください – WearyWanderer

+1

私の答えはもはや関連するポストエディットではないので、 。 "(なぜ、2つのシェーダを編集できるのか?)は、必ずしも良い考え方ではありません。ここでは問題ありませんが、異なる操作をすべて行うための1つの巨大なシェーダプログラムはありません。シェーダでの分岐は非常に効率が悪く、遅いため、2つの異なる機能のシェーダを2つ作成することを意味しても、一般的に回避する必要があります。 – WearyWanderer

+0

その問題に関する関連する質問[こちら](http://stackoverflow.com/questions/30581719/opengl-glsl-uniform-b​​ranching-vs-multiple-shaders) – AbleArcher

答えて

1

これは正当なアプローチですか?

"正当な"をどのように定義するかによって異なります。 の機能をにすることができます。

フラグメントは、discardedのいずれかであり、その全体がであるか、そうではありません。破棄された場合、フラグメントは(ほとんど)効果を持ちません。それが破棄されなければ、すべての出力は定義された値を持っています(つまり、あなたが書いたもの)か、または未定義の値を持っています。

しかし、未定義の値は他の状態によってはOKでもかまいません。たとえば、frambuffer's draw buffer stateは、FS出力カラーを実際のカラー添付ファイルにルーティングします。また、GL_NONEにルーティングすることもできます。同様に、添付ファイルごとにcolor write masksを使用して、書き込みしたくない添付ファイルへの書き込みを無効にすることができます。

しかし、これは、フラグメントごとに決定できないことを意味します。これは、シェーダの外部の状態を使用してのみ判断できます。 FSはこれを起こさせることも起こらないこともできません。状態の変更を伴う描画呼び出しの間に実行する必要があります。

Modeが何らかの種類のuniformの場合は、それは問題ありません。しかし、頂点ごとまたはフラグメントごとに導出されたものであれば、効果的には機能しません。

分岐性能は、Modeに依存します。 uniformの場合は、まったく気にする必要はありません。現代GPUはこれをうまく処理できます。それが何か他のものであれば...あなたの全体計画はすでに詳細化されている理由で機能しなくなるので、心配する必要はありません;)

これはすべて、私はこの種の複雑さ。それは運転手の視点から物事を扱う混乱する方法です。また、他のアプリケーションが依存していないことに頼っているので、ドライバのバグに気づくことができます。あなたの考えは、レンダリングターゲットと出力の性質を根本的に変えるので、あなたのアイデアは従来のUbershaderとは異なります。

私はできるだけ従来の方法でやることをお勧めします。別のファイルの数を最小限に抑えるには、を使用し、#ifdefを使用し、ロードする理由に基づいてシェーダ文字列を#defineにパッチするだけです。したがって、1つのシェーダファイルがありますが、そこから2つのプログラムが構築されています。

+0

'Mode'は統一されています。シェーダコードの重複度(ファイル数)は私が解決しようとしている1つの問題です。もう1つは、2つの異なるプログラムを呼び出すときにほぼ同じ制服を設定するアプリケーションコードの複製です。あなたは「運転手の視点から物事を扱うのは混乱する方法です」ということについてもっと言えますか? – AbleArcher

+1

@thethuthinnang: "2つの異なるプログラムを呼び出すときに、ほぼ同じユニフォームを設定するアプリケーションコードを複製する*"これはユニフォームバッファのためのものです。 –

+0

ご協力いただきありがとうございます。あなたの答えを読んでいただければ幸いです。 – AbleArcher

関連する問題