Для 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, и как я могу получить правильную частоту кадров при этом?