iOs: алиасинг с OpenGL, но не с Cocos2D? - PullRequest
3 голосов
/ 27 октября 2011

Я новичок в программировании opengl, но я делаю что-то очень простое, и разница в качестве между пользовательским кодом opengl и cocos2d огромна!

Я пытаюсь просто загрузить изображение и постоянно вращать его каждый кадр. С моим кодом я получаю много мерцающих острых краев, в то время как у cocos2d все это красиво и плавно. Я настроил 4-хкратное сглаживание мультисэмплинга, используя рекомендованный Apple код для iOs 4 в своем коде, и все же он выглядит очень плохо по сравнению с cocos2d без MSAA.

Вы можете увидеть различия здесь: Пользовательский код OpenGL (с MSAA): custom opengl code

cocos2D (без MSAA): cocos2d

Кто-нибудь знает, чего мне не хватает, чтобы добиться такой плавной графики? Просматривая код cocos2d, я обнаружил некоторые ссылки, которые связывают псевдонимы с GL_LINEAR. Я добавил параметры GL_LINEAR в свои текстуры, как кокосы, но все равно выглядит плохо.

1 Ответ

3 голосов
/ 27 октября 2011

Сглаживание делает именно то, что говорит название: оно не позволяет примитивам принимать псевдонимы, такие как прямая (диагональная) линия, превращающаяся в лестницу. Поскольку сглаживание обычно приводит к «мягким» краям, иногда этот термин используется для обозначения любого алгоритмического «смягчения», но это неправильно.

Предполагая, что ваша исходная текстура уже содержит некоторое сглаживание для рендеринга изогнутых краев вашего автомобиля на пиксельную сетку (поэтому, если вы открыли исходный PNG или что-то еще в художественной программе и увеличили края, которые вы видите немного мягкости), я думаю, что ваш код не может применить мультисэмплинг по любой причине. Если вы увеличите масштаб и посмотрите на верхний край крыши, посмотрите на переход между самой верхней частью ступеньки справа и той, что слева. Резкий темный цвет сверху просто спонтанно увеличивает пиксель. Это симптоматично, что этот край находится в исходной текстуре и копируется попиксельно.

GL_LINEAR - это параметр фильтрации, который влияет на то, как OpenGL отвечает на вопросы, например, «если исходный пиксель в точке (0, 0) имеет один цвет, а в точке (0, 1) - другой, то какой цвет в точке (0, 0,5) ? Если вы применяете линейную фильтрацию, то когда вы масштабируете текстуру выше ее собственного размера, дополнительные пиксели, которые должен придумать OpenGL, будут созданы с использованием линейной комбинации ближайших исходных пикселей. Если бы вы использовали GL_NEAREST, то это был бы цвет любого исходного пикселя. Так что в этом разница между текстурами, которые увеличиваются до размытия и низкой контрастности, и текстурами, которые выглядят как мозаики с очевидными пикселями. Так что это (обычно) добавляет размытость и мягкость к изображению в целом, но на самом деле не имеет ничего общего с сглаживанием.

Относительно того, почему вы не получаете сглаживание, на ум приходят две возможные причины. У вас может быть какая-то ошибка в вашем коде, или вы просто используете алгоритм, отличный от Cocos2D. Аппаратная поддержка мультисэмплинга Apple появилась только в iOS 4, и Cocos2D существовал еще до того, что, возможно, придерживался «программного» метода (в частности, рендеринг всей сцены попиксельно в 4 раза, а затем графический процессор уменьшал ее масштаб). Последнее будет значительно медленнее, но не позволит аппаратным средствам попытаться оптимизировать процесс. Одна оптимизация, которую иногда применяет некоторое аппаратное обеспечение, - это мультисэмплирование только по краям геометрии (приблизительно). Это, очевидно, не принесет вам никакой пользы.

Другая возможность заключается в том, что вы уменьшаете изображение, когда рисуете (хотя это не выглядит так), и Cocos2D генерирует MIP-карты, а вы нет. Mip-карты предварительно вычисляют определенные масштабы изображения и работают оттуда при рисовании на экране. Это делает возможным применение более дорогого алгоритма и приводит к снижению псевдонимов.

Можете ли вы опубликовать код?

...