Просмотр памяти графического процессора / Просмотр пространства памяти Texture2D для отладки

У меня есть вопрос о 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 в первую очередь?

person SinisterMJ    schedule 09.08.2011    source источник


Ответы (1)


  • Map, memcpy, Unmap действительно не должны падать, если только вы не пытаетесь скопировать слишком много данных в текстуру. Было бы интересно узнать, что возвращает "GetDataSize()". Это равно 307 200? Если это больше, чем это, то это ваша проблема.

  • Texture2D возвращает float4, потому что это то, о чем вы просили. Если вы пишете float r = g_txDiffuse.Load( ... ). 8 бит расширяются до нормализованного числа с плавающей запятой как часть процесса загрузки. Кстати, вы уверены, что ваш расчет "loc" верен, потому что, как вы это сделали сейчас, loc.x и loc.y всегда будут одинаковыми.

  • Вы можете отлаживать то, что происходит с DirectX, используя PIX. Это отличный инструмент, и я настоятельно рекомендую вам ознакомиться с ним.

person Goz    schedule 15.08.2011