2

カメラから送信された 8 ビット画像で計算を行いたいのですが、それらにアクセスする方法がわかりません。

以下は、テクスチャ オブジェクト/リソース ビューを作成するための私のコードです。

D3D11_TEXTURE2D_DESC tDesc;
tDesc.Height = 480;
tDesc.Width = 640;
tDesc.Usage = D3D11_USAGE_DYNAMIC;
tDesc.MipLevels = 1;
tDesc.ArraySize = 1;
tDesc.SampleDesc.Count = 1;
tDesc.SampleDesc.Quality = 0;
tDesc.Format = DXGI_FORMAT_R8_UINT;
tDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
tDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
tDesc.MiscFlags = 0;

V_RETURN(pd3dDevice->CreateTexture2D(&tDesc, NULL, &g_pCurrentImage));

D3D11_SHADER_RESOURCE_VIEW_DESC rvDesc;
g_pCurrentImage->GetDesc(&tDesc);
rvDesc.Format = DXGI_FORMAT_R8_UINT;
rvDesc.Texture2D.MipLevels = tDesc.MipLevels;
rvDesc.Texture2D.MostDetailedMip = tDesc.MipLevels - 1;
rvDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D;
V_RETURN(pd3dDevice->CreateShaderResourceView(g_pCurrentImage, &rvDesc, &g_pImageRV));

次のコードでテクスチャを更新します。

if( !g_updateDone ) {
    D3D11_MAPPED_SUBRESOURCE resource;
    resource.pData = g_Images.pData;
    resource.RowPitch = 640;
    resource.DepthPitch = 1;
    okay = pd3dImmediateContext->Map(g_pCurrentImage, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
    g_updateDone = true;
    }
pd3dImmediateContext->PSSetShaderResources(0, 1, &g_pImageRV);

HLSL ファイル (クワッドを取り、画面上にクワッドとして表示):

//-----------------------------------------------------------------------------------------
// Textures and Samplers
//-----------------------------------------------------------------------------------------

Texture2D <int> g_txDiffuse : register( t0 );
SamplerState g_samLinear : register( s0 );

//--------------------------------------------------------------------------------------
// shader input/output structure
//--------------------------------------------------------------------------------------

struct VS_INPUT
{
    float4 Position     : POSITION; // vertex position 
    float2 TextureUV    : TEXCOORD0;// vertex texture coords 
};

struct VS_OUTPUT
{
    float4 Position     : SV_POSITION; // vertex position 
    float2 TextureUV    : TEXCOORD0;   // vertex texture coords 
};

//--------------------------------------------------------------------------------------
// This shader computes standard transform and lighting
//--------------------------------------------------------------------------------------
VS_OUTPUT RenderSceneVS( VS_INPUT input )
{
    VS_OUTPUT Output;

    Output.Position = input.Position;

    Output.TextureUV = input.TextureUV; 

    return Output;    
}

//--------------------------------------------------------------------------------------
// This shader outputs the pixel's color by modulating the texture's
// color with diffuse material color
//--------------------------------------------------------------------------------------

float4 RenderScenePS( VS_OUTPUT In ) : SV_TARGET
{ 
    int3 loc;
    loc.x = 0;
    loc.y = 0;
    loc.z = 0;
    int r = g_txDiffuse.Load(loc);
    float fTest = (float) r;

    fTest = fTest / 256;

    return float4( In.TextureUV.x, In.TextureUV.y, In.TextureUV.x + In.TextureUV.y, fTest);
}

これを実行しようとすると、エラー X4532: cannot map expression to pixel shader instruction set が表示されます

デバッグしようとすると、g_pCurrentImage のデータを見ようとすると、サーフェスを表示できないと表示され、それを

return float4( In.TextureUV.x, In.TextureUV.y, In.TextureUV.x + In.TextureUV.y, 1);

DirectX デバッガー (この場合は PIX) は最初の行を無視するだけで、最初の行に到達しないため、デバッグできません。これに対処する方法のオプションが不足しています。やりたいことは基本的な数学の指示だけですが、ピクセルシェーダーを完全に機能させることができません。

4

1 に答える 1

0

テクスチャにデータを取り込もうとしている方法は機能しません。Map() 呼び出しは、D3D11_MAPPED_SUBRESOURCE 構造体に入力します。これにより、データを書き込むためのポインターが提供され、尊重する必要がある行とスライス ピッチが通知されます。そのため、Map() を呼び出し、提供されたポインターにデータを書き込んでから、Unmap() を呼び出します。

または、UpdateSubresource() メソッドを使用することもできます。このメソッドは、Map() で行おうとしているように、指定したポインターとピッチ情報を受け取り、データをテクスチャにコピーします。

于 2011-07-19T18:01:16.303 に答える