現在、同じタイプのオブジェクトを処理する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);
}
}
これは正当なアプローチですか?何か心配すべきことはありますか?
あなたが編集した内容を見て、この方法は問題ありません。 *しかし*、シェーダコードで分岐について言及したことをまだ見ています。遅いですから、もしあなたが1つのシェイダーをすべてのソリューションにしたいので、if文を追加し始めたらスピードの心配は最低限に留めてください – WearyWanderer
私の答えはもはや関連するポストエディットではないので、 。 "(なぜ、2つのシェーダを編集できるのか?)は、必ずしも良い考え方ではありません。ここでは問題ありませんが、異なる操作をすべて行うための1つの巨大なシェーダプログラムはありません。シェーダでの分岐は非常に効率が悪く、遅いため、2つの異なる機能のシェーダを2つ作成することを意味しても、一般的に回避する必要があります。 – WearyWanderer
その問題に関する関連する質問[こちら](http://stackoverflow.com/questions/30581719/opengl-glsl-uniform-branching-vs-multiple-shaders) – AbleArcher