У меня есть вопрос о 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, данные там - действительное 8-битное монохромное изображение. Я убедился, что данные, поступающие с камеры, являются 8-битными монохромными 640x480.
Есть несколько вещей, которые я не до конца понимаю:
- если я запускаю процедуру Map / memcpy / Unmap в каждом кадре, драйвер, в конечном счете, падает, система перестает отвечать на запросы. Есть ли другой способ обновить полную текстуру каждого кадра, что должно быть сделано?
- Текстура, которую я загрузил, 8-битная, почему же Texture2D.load () возвращает float4? Нужно ли использовать другой метод для доступа к данным текстуры? Я попытался., Но это тоже не сработало. Должен ли я использовать буфер int или что-то вместо этого?
- есть ли способ отладки памяти GPU, чтобы проверить, сработал ли в первую очередь memcpy?