0

DirectCompute の学習を始めたばかりで、学習目的で、テクスチャをぼかす単純な畳み込みフィルターを作成したいと考えています。テクスチャをぼかすために、次の計算シェーダーを作成しました。

Texture2D<float4> inputTex;
RWTexture2D<float4> outputTex;

[numthreads(32, 32, 1)]
void main( uint3 DTid : SV_DispatchThreadID )
{
    float4 totalPixVal = float4( 0.0f, 0.0f, 0.0f, 0.0f );
    for ( int y = -3; y < 3; ++y )
        for ( int x = -3; x < 3; ++x )
            totalPixVal += inputTex.Load( uint3(DTid.x + x, DTid.y + y, DTid.z) );

    totalPixVal = float4( totalPixVal.xyz / 49.0f, 1.0f );

    float4 inPix       = inputTex.Load( DTid );
    outputTex[DTid.xy] = totalPixVal;
}

次のパラメーターを使用して呼び出します。

DeviceContext->Dispatch( inputTexture->Width / 32, inputTexture->Height / 32, 1 );

このシェーダは、現在のピクセルとその 48 個の隣接ピクセルの平均カラー値を取得し、ぼかし効果を発生させます。

ぼかし部分は正常に動作するようになりましたが、シェーダーが出力する色が正しくないようです。シェーダーをテストするために、黒の背景に真っ白な形状のシンプルな画像を使用しています。私が期待する出力は、黒い背景にぼやけた純粋な白い形ですが、白い形はもはや白ではなく、灰色です。コードを何度も見直しましたが、どこに問題があるのか​​ わかりません。各テクスチャのサイズは同じ 512x512 ピクセルです。

これは私の入力画像です:

入力画像

そして、これは私が得る出力です:

出力画像

どんな助けでも大歓迎です。

ありがとう

4

1 に答える 1

2

49ピクセルではなく、36ピクセルのみを合計しています。変更:

for ( int y = -3; y < 3; ++y )
    for ( int x = -3; x < 3; ++x )

に:

for ( int y = -3; y <= 3; ++y )
    for ( int x = -3; x <= 3; ++x )
于 2014-07-25T17:32:37.893 に答える