1

DirectX11 Compute Shaders を使用したフラクタル レンダリングの実験を試みています。提供されている例は、FeatureLevel_10 デバイスで実行されます。

RwStructured 出力バッファーのデータ形式は R32G32B32A32_FLOAT です

問題は、バッファーに書き込むときに、ALPHA ( w ) 値だけが他に何も書き込まれないように見えることです。シェーダー コードは次のとおりです。

struct BufType
{
    float4 value;
};

cbuffer ScreenConstants : register(b0)
{
  float2 ScreenDimensions;
  float2 Padding;
};

RWStructuredBuffer<BufType> BufferOut : register(u0);

[numthreads(1, 1, 1)]
void Main( uint3 DTid : SV_DispatchThreadID )
{
    uint index = DTid.y * ScreenDimensions.x + DTid.x;
    
    float minRe = -2.0f;
    float maxRe = 1.0f;
    float minIm = -1.2;
    float maxIm = minIm + ( maxRe - minRe ) * ScreenDimensions.y / ScreenDimensions.x;
    float reFactor = (maxRe - minRe ) / (ScreenDimensions.x - 1.0f);
    float imFactor = (maxIm - minIm ) / (ScreenDimensions.y - 1.0f);
    float cim = maxIm - DTid.y * imFactor;
    
    uint maxIterations = 30;
    
    float cre = minRe + DTid.x * reFactor;
    float zre = cre;
    float zim = cim;
    
    bool isInside = true;
    uint iterationsRun = 0;
    
    for( uint n = 0; n < maxIterations; ++n )
    {
        float zre2 = zre * zre;
        float zim2 = zim * zim;
        
        if ( zre2 + zim2 > 4.0f )
        {
            isInside = false;
            iterationsRun = n;
        }
        
        zim = 2 * zre * zim + cim;
        zre = zre2 - zim2 + cre;
    }
    
    if ( isInside )
    { 
        BufferOut[index].value = float4(1.0f,0.0f,0.0f,1.0f);
    }
}

コードは実際にはある意味では正しい結果 ( 2D マンデルブロー集合 ) を生成しますが、どういうわけかアルファ値だけが変更され、他には何も書き込まれていないように見えますが、集合内のピクセルは赤く着色されているはずです... (画像は黒 &白い )

ここで何が起こっているのか、誰にも手がかりがありますか?

4

5 に答える 5

0

よくわかりませんが、BufferOutdeclの場合はそうではありません。

RWStructuredBuffer<BufType> BufferOut : register(u0);

それ以外の :

RWStructuredBuffer BufferOut : register(u0);

float4書き込みターゲットのみを使用している場合は、次のように使用してください。

RWBuffer<float4> BufferOut : register (u0);

多分これは役立つかもしれません。

于 2009-11-21T17:31:57.920 に答える
0

今日も遊んだ後、もう一度同じ問題に遭遇しました。次のコードでは、すべて白の出力が生成されました。

[numthreads(1, 1, 1)]
void Main( uint3 dispatchId : SV_DispatchThreadID )
{
    float4 color = float4(1.0f,0.0f,0.0f,1.0f);
    WriteResult(dispatchId,color);
}

WriteResult メソッドは、私の hlsl 標準ライブラリのユーティリティ メソッドです。

簡単に言えば。ドライバーのバージョンを 192 から 195(ベータ) にアップグレードした後、問題は解消されました。ドライバーには、計算シェーダーのサポートにいくつかの決定的な問題が残っているようですので、注意してください。

于 2009-11-22T05:30:12.753 に答える
-1

見たところ、コンピューターシェーダーは、従来のピクセルシェーダーよりも一般的な計算モデルが必要な場合、またはデータをロードして高速共有メモリ内のスレッド間で共有できる場合にのみ役立ちます。マンデルブロシェーダー用のピクセルシェーダーを使用すると、パフォーマンスが向上すると確信しています。

私のセットアップ(win7、feb 10 dx sdk、gtx480)では、計算シェーダーのセットアップ時間は0.2〜0.3msを超えています(SRVとUAVをバインドしてからdispatch()を呼び出します)。

PSの実装を行う場合は、経験を投稿してください。

于 2010-06-15T18:04:58.610 に答える
-3

DX 計算シェーダーを直接使用した経験はありませんが...

なぜアルファ= 1.0を設定していますか?

IIRC は、ピクセルを 100% 透明にするため、内側のピクセルは透明な赤になり、その背後に描画された色として表示されます。alpha = 1.0 の場合、RGB コンポーネントは使用されません。

于 2009-11-20T18:49:19.277 に答える