Просмотр памяти графического процессора / просмотр памяти Texture2D для отладки - PullRequest
0 голосов
/ 09 августа 2011

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

1 Ответ

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

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

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

...