查看GPU内存/查看Texture2D内存空间以进行调试

时间:2011-08-09 14:39:58

标签: directx hlsl texture2d pixel-shader

我有一个关于我想要实现的PixelShader的问题,以及我目前做的事情(这只是为了调试,并试图解决问题):

    int3 loc;
    loc.x = (int)(In.TextureUV.x * resolution_XY.x);
    loc.y = (int)(In.TextureUV.x * resolution_XY.x);
    loc.z = 0;

    float4 r = g_txDiffuse.Load(loc);
    return float4(r.x, r.y, r.z, 1);

重点是,这总是0,0,0,1

创建纹理缓冲区:

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_MAPPED_SUBRESOURCE resource;
    pd3dImmediateContext->Map(g_pCurrentImage, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
    memcpy( resource.pData, g_Images.GetData(), g_Images.GetDataSize() );
    pd3dImmediateContext->Unmap( g_pCurrentImage, 0 );

我检查了resource.pData,其中的数据是有效的8bit单色图像。我确保来自相机的数据是8位单色640x480。

有一些我不太了解的事情:

  • 如果我在每个帧中运行Map / memcpy / Unmap例程,驱动程序最终会崩溃,系统将无法响应。是否有不同的方法来更新应该完成的每一帧的完整纹理?
  • 我上传的纹理是8bit,为什么Texture2D.load()一个float4返回?我是否必须使用其他方法来访问纹理数据?我试图对它进行采样,但这也没有用。我是否必须使用int缓冲区或其他东西?
  • 有没有办法调试GPU内存,检查memcpy是否起作用?

1 个答案:

答案 0 :(得分:0)

  • Map,memcpy,Unmap真的不应该崩溃,除非你试图将太多数据复制到纹理中。知道“GetDataSize()”返回的内容会很有趣。它等于307,200吗?如果不止于此,那就是你的问题。

  • Texture2D返回一个float4,因为那就是你要求的。如果你写float r = g_txDiffuse.Load(...)。作为加载过程的一部分,8位扩展到标准化浮点数。你确定,你的“loc”计算是正确的,因为你现在已经知道loc.x和loc.y总是一样的。

  • 您可以使用PIX调试使用DirectX进行的操作。它是一个很棒的工具,我强烈建议你熟悉它。