Мой вопрос касается конкретно Metal, так как я не знаю, изменится ли ответ для другого API.
То, что я считаю, я понимаю до сих пор это:
Текстура с mip-map имеет предварительно вычисленные «уровни детализации», где более низкие уровни детализации создаются путем понижения исходной текстуры каким-либо значимым образом.
Уровни MipMap упоминаются в нисходящем уровне детализации, где уровень
0- это исходная текстура, а более высокие уровни - ее уменьшение в два раза.Большинство графических процессоров реализуют трилинейную фильтрацию, которая выбирает два соседних уровня mipmap для каждой выборки, выборки с каждого уровня с использованием билинейной фильтрации, а затем линейно смешивает эти выборки.
Я не совсем понимаю, как выбираются эти уровни mipmap. В документации стандартной библиотеки Metal я вижу, что образцы могут быть взяты с указанием или без указания экземпляра lod_optionsтипа. Я бы предположил, что этот аргумент меняет способ выбора уровней mipmap, и, по-видимому, существует три вида lod_options2D-текстур:
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 на новых архитектурах.