У меня есть вопрос о 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? Должен ли я использовать другой метод для доступа к данным текстуры? Я попытался .sample, но это тоже не сработало. Должен ли я вместо этого использовать буфер int или что-то в этом роде?
- есть ли способ отладить память графического процессора, чтобы проверить, работал ли memcpy в первую очередь?