Не удается получить доступ к текстуре DXGI_FORMAT_R8_UINT - PullRequest
1 голос
/ 08 апреля 2011

Я хочу сделать некоторые вычисления для 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: невозможно сопоставить выражение с набором инструкций пиксельного шейдера

Когда я пытаюсь отладить его, когда я пытаюсь увидеть данные g_pCurrentImage, он просто говорит, что не можетповерхность дисплея, и при замене на

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

отладчик DirectX (в данном случае PIX) просто игнорирует первые строки, они никогда не достигаются, и поэтому я не могу отладить его.У меня закончились варианты, как с этим справиться, все, что я хочу сделать, - это некоторые базовые математические инструкции, но я не могу заставить работать пиксельный шейдер.

1 Ответ

0 голосов
/ 19 июля 2011

Способ, которым вы пытаетесь вставить данные в текстуру, не работает. Вызов Map () заполняет структуру D3D11_MAPPED_SUBRESOURCE: он дает вам указатель для записи данных и сообщает, какой шаг строки и среза вы должны соблюдать. Поэтому вы вызываете Map (), записываете свои данные в предоставленный указатель, а затем вызываете Unmap ().

В качестве альтернативы вы можете использовать метод UpdateSubresource (), который берет указанную вами информацию об указателе и шаге и копирует данные в текстуру, как вы пытаетесь это сделать с Map ().

...