我有一个关于我正在尝试实现的 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 是否工作?