0

我有一个关于我正在尝试实现的 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 返回?我是否必须使用不同的方法来访问纹理数据?我试图对其进行 .sample ,但这也不起作用。我是否必须使用 int 缓冲区或其他东西?
  • 有没有办法调试 GPU 内存,首先检查 memcpy 是否工作?
4

1 回答 1

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

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

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

于 2011-08-15T12:35:35.540 回答