私は問題があり、私はそれの周りに私の頭を包んでいるように見えることができないので、私はここで誰かが私を助けることができるかもしれないことを望んでいた。ARB Fragment If/Else
私はminiGLSL用のコンパイラを作成しています。私はARBフラグメントプログラムに出力する必要があるところですが、問題は、ターゲットにしなければならないARBが分岐をサポートしていないことです。 (サポートされる指示の完全なリストはhttp://petewarden.com/notes/archives/2005/05/fragment_progra_2.htmlでここに見つけることができる)。
私はCMPプログラムを次のように使用しています(0以上はtrue、それ以外の場合はfalse)。#はコメントのため、ここでフォーマットが悪い#
ARBフラグメントにif (a < b)
a = 1 + 1;
if (f < g)
c = 2 + 3;
else
if (h < i)
b = 1 + 2;
else
d = 2 + 3;
:
TEMP cond1, cond2, cond3, tempvar1, tempvar2, tempvar3, tempvar4, a, b, c, d, e, f, g;
//TOP IF
//condition a < b
SLT a, b, cond1;
SUB cond1, 1.0, cond1;
//Assign if true
ADD 1.0, 1.0, tempvar1;
CMP cond1, a, tempvar1, a;
//Condition f < g
SLT f, g, cond2;
SUB cond2, 1.0, cond2;
//if top level if was false, assign false, otherwise assign it to itself
CMP cond1, -1.0, cond2, cond2;
//Assignment
ADD 2.0, 3.0, tempvar2;
CMP cond2, c, tempvar2, c;
//TOP ELSE
//if h < i
SLT h, i, cond2;
SUB cond2, 1.0, cond2;
//If top level if was true, make false
CMP cond1, cond2, -1.0, cond2;
CMP cond2, tempvar3, b, b;
//Else
//if top level if was true, and previous if was false, make true
これは私が私のコードは本当に醜い取得を開始する予定です実現する前に私が取得する場所についてです。 if/elseの各レベルは積み上げ比較を継続的に導入する予定であり、さらに最後のelseはcond2を再評価するか、別のレジスタを使用する必要があります。私はおそらくここで何か間違っていることを知っているが、私は何が分からない。私はカウンターを使って試して、if/elseブロック、anding、oringなどの前のステージの結果を追加しようとしましたが、if/elseブロックをARBフラグメントアセンブリに変換する方法については、 CMPステートメントのスタックがますます大きくなっています。どのように私のコンパイラがこれをプログラムで出力できるように、これをよりシンプルにするか考えている人はいますか?私はこの時点で最適化についてはあまり心配していません、私はちょうどそれを働かせたいです。
ありがとう