2017-02-11 6 views
0

Я написал небольшую DirectX 11 приложение на Windows 10 x64 с использованием C++. Теперь я хочу визуализировать текстуры с низким разрешением (например, 16px * 16px), не теряя при этом резкости при увеличении (как в играх типа Terraria). Так только вариантов я вижу, что делают спрайты текстур высокого разрешения или изменить состояние сэмплер от D3D11_FILTER_MIN_MAG_MIP_LINEAR к D3D11_FILTER_MIN_MAG_MIP_POINT. Первый вариант для меня не вариант, потому что я хочу сохранить видеопамять и не тратить ее на избыточную информацию. Но второй подход вызывает некоторые новые проблемы. Если я перемещаю текстурированный прямоугольник с помощью этого сэмплера, я получаю раздражающее мерцание.DirectX 11 фильтр текстуры линейный/точка фликера

Точка:
enter image description here

Линейная:
enter image description here

Точка:
enter image description here

Линейная:
enter image description here

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

enter image description here

Я не отправлял никакого кода, потому что я думаю, что эта проблема не связана с каким-либо конкретным кодом и не помогу. Так что если я ошибаюсь в этом предположении, пожалуйста, сообщите.
Наконец, вопрос в том, как я могу исправить это или какие альтернативы оставлены?

+0

Ответ на ваш вопрос: вы должны выровнять текстурированные квадратные тексели с пикселями поверхности. Чтобы убедиться, что вам нужно только сдвинуть квад/ув на несколько коэффициентов текселя. Вы можете добиться того, чего хотите, либо с линейным, либо с ближайшим сэмплером, но, если возможно, попробуйте сохранить линейный, поскольку он может быть быстрее, чем ближайший на современном оборудовании. – galop1n

ответ

0

Режим фильтрации не имеет никакого отношения к использованию памяти. Вы можете использовать эти режимы фильтрации даже на текстурах без цепей mipmap, хотя фильтрация менее эффективна, когда размер целевого пикселя будет использовать более низкий mip.

Фильтр ближайшей точки, вероятно, всегда будет вызывать артефакты, если вы не сможете точно отобразить изображение с текселем в пиксель 1: 1, поэтому это не особенно полезно.

SpriteBatch в DirectX Tool Kit по умолчанию для использования D3D11_FILTER_MIN_MAG_MIP_LINEAR и D3D11_FILTER_MIN_MAG_MIP_LINEAR, которая стремится работать лучше для 2D спрайтов.

Вы можете попытаться использовать D3D11_FILTER_ANISOTROPIC, чтобы узнать, улучшит ли ваш сценарий, но имейте в виду, что вам нужно использовать MaxAnisotropy из 2, если вы поддерживаете Direct3D Hardware Feature Level 9.1.Если у вас есть более высокий уровень детализации, вы можете использовать D3D11_MAX_MAXANISOTROPY.

Для современных ПК или универсальной платформы Windows (UWP), минимум D3D_FEATURE_LEVEL_9_3 разумно, как 9,2 и 9,1 довольно старые. Даже телефон Windows составляет не менее 9,3.

+0

«Режим фильтрации не имеет ничего общего с использованием памяти». Я думаю, вы меня неправильно поняли. Я не имел в виду, что режим фильтрации вызывает более или менее потребление памяти. Я имел в виду, что если я использую линейную фильтрацию, мне приходится использовать гораздо большие текстуры, что приводит к увеличению потребления памяти. Поэтому мне интересно, есть ли лучший способ. – Michael

+0

Почему линейная и точка вообще не влияет на размер текстуры? –

+0

Например, если я растягиваю текстуру 16px x 16px до 200px x 200px, она будет выглядеть размытой с линейной и четкой с точечной фильтрацией. Таким образом, единственный способ, которым он будет выглядеть резким в линейном режиме, - увеличить размер текстуры. – Michael

Смежные вопросы