Почему мои текстуры не отображаются более подробно в моей игре DirectX11?

#c #directx-11 #game-development

#c #directx-11 #разработка игры

Вопрос:

Я пытаюсь написать небольшую 3D-игру на C , используя DirectX 11. Это абсолютно первый раз, когда я пытаюсь написать игру, используя только графический API. Я следил за учебными пособиями на веб-сайте Rastertek.com до руководства 9 для окружающего освещения.

После реализации движения и столкновений для игрока я увеличил размер своей игровой зоны. Именно тогда я заметил свою проблему: текстуры, которые я использую для стен и пола моей игровой площадки, отображаются не так, как я ожидал.

Стена крупным планом

Стена издалека

Может быть, вы можете сказать, как линии на стене выглядят странно разбитыми — я ожидал, что они будут отображаться правильно на больших расстояниях (например, они крупным планом).

Однако больше всего мне кажется странным то, что линии могут отображаться издалека, но только при перемещении камеры по сцене и только на определенных участках стены. Стояние на месте снова нарушает текстуру. Я пытался запечатлеть этот эффект на видео, но мне не удалось добиться его отображения в видео, которое я снял с GeForce Experience.

Я попытался поиграть с кучей настроек, предлагаемых DirectX, таких как растеризатор или описания буфера глубины, я попытался включить и отключить VSync, сглаживание и мультисэмплинг, я попытался использовать анизотропную фильтрацию вместо линейной фильтрации… Но ничего из этого не имело никакого эффекта.

Я не знаю, где искать и что попробовать дальше. Должен ли я просто смириться с тем, что мои текстуры будут выглядеть ужасно на любом расстоянии?

Ответ №1:

Вам нужно сгенерировать mip-карты для загружаемой текстуры. Проверьте DDSTextureLoader.h/ cpp и WICTextureLoader.h/ cpp здесь .

Например, чтобы загрузить изображение .dds с mip-картами, вы бы использовали:

 HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice,
                                         ID3D11DeviceContext* d3dContext,
                                         const wchar_t* fileName,
                                         size_t maxsize,
                                         D3D11_USAGE usage,
                                         unsigned int bindFlags,
                                         unsigned int cpuAccessFlags,
                                         unsigned int miscFlags,
                                         bool forceSRGB,
                                         ID3D11Resource** texture,
                                         ID3D11ShaderResourceView** textureView,
                                         DDS_ALPHA_MODE* alphaMode )
 

Пример использования:

 HRESULT hr = DirectX::CreateDDSTextureFromFileEx(device, context, path.c_str(), 0, D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, 0, D3D11_RESOURCE_MISC_GENERATE_MIPS, 0, reinterpret_cast<ID3D11Resource**>(amp;pTexture), amp;pSRV);
THROW_IF_FAILED(hr);
 

Обратите внимание на флаги D3D11_BIND_RENDER_TARGET и D3D11_RESOURCE_MISC_GENERATE_MIPS используемые.

Комментарии:

1. Большое спасибо за ответ, вы наставили меня на правильный путь! Простая проверка опции «генерировать mip-карты» при сохранении моих текстур dds сразу устранила проблему, теперь мои текстуры отображаются корректно даже с очень большого расстояния. Я попытался загрузить их, как вы описали, но когда я установил формат описания элемента ввода устройства D3DDevice в формат, который я экспортировал в (BC7), я получаю сообщение об ошибке Element[0]'s format (BC7_UNORM) cannot be used with the Input Assembler . Может быть, тема для другого вопроса… Отмечу этот ответ, поскольку теперь он работает так, как ожидалось.

2. @Ploinky очевидно, что этот формат не может быть привязан к цели рендеринга, что требуется, если вы хотите, чтобы mip-карты создавались таким образом. Я рад, что у вас все получилось.