Directx Can';t访问DXGI格式的UINT纹理

Directx Can';t访问DXGI格式的UINT纹理,directx,pixel-shader,Directx,Pixel Shader,我想对摄像机发送的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

我想对摄像机发送的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文件(采用四元组,在屏幕上显示为四元组):


DirectX调试器(本例中为PIX)只会忽略第一行,它们永远不会到达,因此我无法调试它。关于如何处理这个问题,我已经没有选择了,我只想做一些基本的数学说明,但我完全无法让像素着色器工作。

您尝试将数据导入纹理的方式不起作用。Map()调用填充D3D11_MAPPED_子资源结构:它为您提供一个将数据写入的指针,并告诉您必须遵守的行和片间距。因此,调用Map(),将数据写入提供的指针,然后调用Unmap()


或者,您也可以使用UpdateSubresource()方法,该方法获取您提供的指针和音调信息,并将数据复制到纹理中,就像您尝试使用Map()所做的那样。

尝试将数据获取到纹理中的方法不起作用。Map()调用填充D3D11_MAPPED_子资源结构:它为您提供一个将数据写入的指针,并告诉您必须遵守的行和片间距。因此,调用Map(),将数据写入提供的指针,然后调用Unmap()


或者,您可以使用UpdateSubresource()方法,该方法获取您提供的指针和基音信息,并将数据复制到纹理中,就像您尝试使用Map()一样。

当您遇到X4532错误时,您使用哪些参数编译着色器,以及报告的行号是什么?对于我来说,在fxc中使用“fxc/Tps_4_0/ERenderScenePS”可以很好地编译着色器。当出现X4532错误时,您使用哪些参数编译着色器,以及报告的行号是什么?对于我来说,用“fxc/Tps_4_0/ERenderScenePS”在fxc中编译很好。
//-----------------------------------------------------------------------------------------
// 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);
}
return float4( In.TextureUV.x, In.TextureUV.y, In.TextureUV.x + In.TextureUV.y, 1);