Сглаживание в OpenGL ES 2.0

Как сделать сглаживание треугольников на всем рендере? Должен ли я поместить его во фрагментный шейдер? Есть ли другое хорошее решение для улучшения такого рода вещей?

Вот мой "вид", с очень хрустящими краями (не очень красиво).

введите здесь описание изображения


person Ivan Seidel    schedule 29.07.2013    source источник


Ответы (1)


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

Это довольно легко включить с помощью этой библиотеки:

https://code.google.com/p/gdc2011-android-opengl/source/browse/trunk/src/com/example/gdc11/MultisampleConfigChooser.java

Тем не менее, вы должны иметь в виду, что на рендеринг всего будет потрачено 4 или более раз времени, что означает больше времени на обработку и, возможно, меньше FPS ...

Кроме того, если вы эмулируете устройство Android с помощью OpenGL, узнайте, поддерживает ли ваш графический процессор такой тип мультисэмплинга. У меня, например, нет (Tegra).

Вот окончательный результат с мультисэмплингом и без него:

введите здесь описание изображения

person Ivan Seidel    schedule 29.07.2013
comment
Мультисэмплинг не увеличивает время рендеринга в 4 раза. Даже близко. Он по-прежнему выполняет фрагментный шейдер только один раз для каждого пикселя, а затем записывает один и тот же результат до 4 выходных выборок в зависимости от покрытия. Хотя выходной буфер теоретически в 4 раза больше, обычно он сжимается. То, что описывает этот ответ, больше похоже на суперсэмплинг, а это совсем другой метод. - person Reto Koradi; 14.12.2014
comment
@RetoKoradi, но в любом случае фрагментному шейдеру потребуется субрендеринг 4 пикселей, чтобы обработать среднее значение. Если рендеринг одного пикселя стоит 1, то рендеринг 4 тоже будет стоить 4, плюс время на получение среднего... Конечно, это будет не среднее время, а максимальный его предел (поскольку в зависимости от количества ядер GPU, это можно сделать параллельно... Но в любом случае, это будет стоить в 4 раза больше времени на его рендеринг, не считая параллельного рендеринга - person Ivan Seidel; 15.12.2014