Мой вопрос касается конкретно Metal, так как я не знаю, изменится ли ответ для другого API.
То, что я считаю, я понимаю до сих пор это:
Текстура с mip-map имеет предварительно вычисленные «уровни детализации», где более низкие уровни детализации создаются путем понижения исходной текстуры каким-либо значимым образом.
Уровни MipMap упоминаются в нисходящем уровне детализации, где уровень
0
- это исходная текстура, а более высокие уровни - ее уменьшение в два раза.Большинство графических процессоров реализуют трилинейную фильтрацию, которая выбирает два соседних уровня mipmap для каждой выборки, выборки с каждого уровня с использованием билинейной фильтрации, а затем линейно смешивает эти выборки.
Я не совсем понимаю, как выбираются эти уровни mipmap. В документации стандартной библиотеки Metal я вижу, что образцы могут быть взяты с указанием или без указания экземпляра lod_options
типа. Я бы предположил, что этот аргумент меняет способ выбора уровней mipmap, и, по-видимому, существует три вида lod_options
2D-текстур:
bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
К сожалению, документация не объясняет, что делает любая из этих опций. Я могу догадаться, что bias()
смещает некоторый автоматически выбранный уровень детализации, но тогда что означает смещение value
? В каком масштабе он работает? Точно так же, как это lod
в level()
переводе на дискретные уровни MIPMAP? И, работая в предположении, что gradient2d()
использует градиент координат текстуры, как он использует этот градиент для выбора уровня mipmap?
Что еще более важно, если я опущу lod_options
, как тогда выбираются уровни mipmap? Отличается ли это в зависимости от типа выполняемой функции?
И, если заданная по умолчанию операция no-lod-options-option sample()
функции заключается в том, чтобы сделать что-то вроде gradient2D()
(по крайней мере в фрагментном шейдере), использует ли она простые производные экранного пространства, или она работает напрямую с растеризатором и интерполированными координатами текстуры рассчитать точный градиент?
И, наконец, насколько последовательно это поведение от устройства к устройству? Старая статья (старая, как в DirectX 9), которую я прочитал, ссылалась на сложный выбор mipmap для конкретного устройства, но я не знаю, лучше ли выбран mipmap на новых архитектурах.