DX9 GenerateMipSubLevels создает сломанный mipmap и уничтожает частоту кадров - PullRequest
1 голос
/ 11 июля 2019

Для Variance Shadow Mapping Мне нужна усредненная версия моей карты теней с низким разрешением. В DirectX9 я делаю это путем рендеринга расстояний до рендеринга и создания мипмапов. Генерация mipmap должна давать результаты, подобные separable box-filter, но быть быстрее, поскольку для этого есть специальное оборудование. Однако я сталкиваюсь с двумя проблемами:

  • Согласно PIX, каждый следующий уровень mipmap содержит верхний левый квадрант предыдущего (с полным разрешением) вместо полного изображения с половинным разрешением.
  • Частота кадров абсолютно стирается, когда я делаю это: она в 50 раз ниже, чем без генерации mipmap.

Вот как я инициализирую RenderTexture:

D3DXCreateTexture(device, 2048, 2048, 0, D3DUSAGE_RENDERTARGET, D3DFMT_G32R32F, D3DPOOL_DEFAULT, &textureID);
D3DXCreateRenderToSurface(device, 2048, 2048, D3DFMT_G32R32F, TRUE, D3DFMT_D24S8, &renderToSurface);
dxId->GetSurfaceLevel(0, &topSurface);

Вот как я генерирую mipmaps (это делается каждый кадр после завершения рендеринга в shadowMap):

textureID->SetAutoGenFilterType(D3DTEXF_LINEAR);
textureID->GenerateMipSubLevels();

Я думаю, что установка filterType не должна выполняться каждый раз, но удаление этого не имеет значения.

Так как это для Variance Shadow Mapping, мне действительно нужен цветовой формат D3DFMT_G32R32F, но я также попытался D3DFMT_A8R8G8B8, чтобы увидеть, имеет ли это значение, и это не так: mipmap все еще ломается таким же образом и частота кадров по-прежнему 1 кадр / с.

Я также попытался использовать D3DUSAGE_AUTOGENMIPMAP вместо этого, но это не генерировало mipmap вообще согласно PIX. Это выглядит так (и тогда я больше не звоню GenerateMipSubLevels):

D3DXCreateTexture(device, 2048, 2048, 0, D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP, D3DFMT_G32R32F, D3DPOOL_DEFAULT, &textureID);

Обратите внимание, что это в Windows 10 с графическим процессором Geforce 550. Я уже пытался переустановить драйверы видеокарты полностью, на всякий случай, но это не имело значения.

Как я могу получить правильный mipmap для renderTexture в DirectX9, и как я могу получить правильную частоту кадров при этом?

...