Линейные текстуры выглядят так, как будто они выбираются ближе всего, когда квадратор маленький, но линейно, когда большой? - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть спрайт размером 222x372 пикселей, и я рендеринг его в 3 различных масштабах (25%, 40% и 65%), чтобы проверить различные варианты выборки.

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

Если я использую GL_LINEAR_MIPMAP_LINEAR, то текстура выглядит размытой, когда она маленькая, и четкой, когда она большая.Если я использую другие комбинации mipmap, подобное происходит либо с размытым, пиксельным, либо с обоими.(как и ожидалось)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Blurry
OR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); // Pixelated
OR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); // Blurry

Если я использую GL_LINEAR, то при большом размере текстура выглядит четкой, но, к моему удивлению, пикселированной и почти идентичной GL_NEAREST при небольшом.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // When small, pixelated?

См. Это изображение:

See this image

См. GL_LINEAR в масштабе 25% - вы можете видеть сглаживание и пиксельные края.Я ожидал, что линейная интерполяция позволит плавно смешать эти края.

Является ли это предполагаемым поведением, и если да, то есть ли способ получить четкие спрайты, даже если они уменьшены до небольших количеств?Возможно, пользовательские уровни mipmap сгенерированы в Photoshop?

1 Ответ

0 голосов
/ 22 декабря 2018

Это предполагаемое поведение,

Да.При GL_LINEAR площадь фильтра всегда равна 2x2 текселей.Если вы уменьшите размер на 50%, ваш pixel элемент footprint также будет 2x2 текселей, поэтому он все еще работает достаточно хорошо (помимо фактического размера пиксельного элемента footprint, его точное положение в пределах сетки texel также имеет значение,но давайте проигнорируем это для простоты здесь).

Если вы уменьшите до 25%, это означает, что область размером 4x4 текселя отображается на один пиксель на экране - но фильтр будет использовать только блок 2x2 в средней части этого.Таким образом, из 16 значений текселей, которые отображаются на экране, используются только 4, а содержимое остальных 12 полностью игнорируется - поэтому, если у вас есть высокочастотные данные, такие как мелкие детали и острые края, понижающая дискретизация приведет кмного псевдонимов.В конце концов, понижающая дискретизация - это фильтр нижних частот, а высокочастотный контент переживает не так хорошо.

Mipmapping - намеченное решение для такого рода проблем.Вместо того чтобы фильтровать изменяющееся и потенциально огромное количество пикселей (например, если вы отображаете текстуру 1024x1024 на один пиксель, фильтру придется пройти более 1 миллиона пикселей!) Во время выборки, эти операции уже предварительно рассчитаны.,Тексель на уровне 1 mipmap представляет 2x2 текселя уровня 0, а один на уровне 2 представляет 4x4 уровня 0 и т. Д.

и, если да, есть ли способ получить четкие спрайты, даже когдауменьшено до небольших сумм?Возможно, пользовательские уровни mipmap сгенерированы в Photoshop?

Пользовательские изображения mipmap, безусловно, могут немного помочь в вашем сценарии, но главный вопрос: чего вы ожидаете?Если у вас есть изображение с тонкими черными линиями и мелкими деталями в масштабе 100%, существует нет способа сохранить это при значительно более низком разрешении, поэтому результат всегда должен выглядеть немного размытым (потому чтовсе мелкие детали, которые теперь попадают в один пиксель, каким-то образом смешиваются вместе), или это будет выглядеть пиксельно (потому что только некоторые детали, попадающие в пиксель, используются для представления всего пикселя) - теорема выборки Найквиста – Шеннонаверно в этом случае, как и в любом другом.

...