Directx 查看GPU内存/查看纹理2D内存空间以进行调试

Directx 查看GPU内存/查看纹理2D内存空间以进行调试,directx,hlsl,texture2d,pixel-shader,Directx,Hlsl,Texture2d,Pixel Shader,我有一个关于我正在尝试实现的像素着色器的问题,以及我目前所做的事情(这只是为了调试,并试图弄清楚): 关键是,这始终是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; t

我有一个关于我正在尝试实现的像素着色器的问题,以及我目前所做的事情(这只是为了调试,并试图弄清楚):

关键是,这始终是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));
我通过以下方式上传纹理(最后应该是实时显示):

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

有几件事我不太明白:

  • 如果在每一帧中运行Map/memcpy/Unmap例程,驱动程序最终将崩溃,系统将无响应。是否有一种不同的方法来更新每一帧应该完成的完整纹理
  • 我上传的纹理是8比特,为什么Texture2D.load()是float4返回?我是否必须使用不同的方法来访问纹理数据?我试过了,但也没用。我需要使用int缓冲区还是其他什么
  • 有没有办法调试GPU内存,首先检查memcpy是否工作
      • 除非您试图将太多数据复制到纹理中,否则贴图、memcpy、Unmap实际上不应该崩溃。了解“GetDataSize()”返回的内容会很有趣。等于307200吗?如果不止这些,那就是你的问题所在

      • Texture2D返回一个float4,因为这是您要求的。如果写入float r=g_txDiffuse.Load(…)。作为加载过程的一部分,8位扩展为标准化浮点。顺便说一句,你确定你对“loc”的计算是正确的,因为现在的loc.x和loc.y总是相同的

      • 您可以使用PIX调试DirectX的运行情况。这是一个很棒的工具,我强烈建议您熟悉它

      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 );