1

XNA で X by X の任意のテクスチャを 2 by X に削減しようとしています。このコードを実行してみます:

int x;
int y;
float2 minim={1,1};
float2 current;
if(coords.x==0)
{
    for(x=0;x<=range/2;x=x+1)
    {
        coords.x=x;
        current=tex2D(input,coords);
        minim=min(minim,current);       
    }
}
if(coords.x==1)
{
    for(x=range/2;x<=range;x++)
    {
        coords.x=x;
        current=tex2D(input,coords);
        minim=min(minim,current);       
    }
}
return float4(minim,0,1);

コンパイルしようとすると、「ループをアンロールできません」や「ブレークのあるループでグラデーションを使用できません」など、さまざまな問題が発生します。

最初の質問: 単一のシェーダー パスでそれを計算しようとすることで正しい道を進んでいますか、それとも RenderTargets 間の日付をピンポンして、より小さなステップでそれを減らす必要がありますか?

2 番目の質問: アイデアが正しければ、私のコードの何が問題なのですか?

4

2 に答える 2

0

これを実現するために、シェーダーを使用する以外のオプションを検討しましたか?

私の頭の上から:

1) このテクスチャを描画するときは、ソースの四角形に幅 2 と高さ X を指定します。したがって、X x X ではなく、X x 2 だけを描画します。

2) GetData と SetData を使用して、使用したいテクスチャの 2 x X 部分を抽出します。

于 2012-09-14T22:56:08.123 に答える
0

2 番目の質問:そのシェーダーでやりたいことは何でも... コンパイラーは、コンパイル時に「範囲」の値がわからないため、*ループをアンロール*できないと言っています。おそらく、シェーダーモデルのバージョンでは、コンパイル時の定数の反復回数が必要です。「for」条件で動的変数を使用することはできません。

最初の質問:確かに 1 回のパスで言葉で要求することはできますが、シェーダー チャンクは文脈から外れているため、質問 1 には答えられません...

于 2012-09-04T19:34:35.633 に答える