Поведение OpenGL в движке 2D на основе плиток: «привязка» пикселя во время движения, ошибки аппроксимации? - PullRequest
5 голосов
/ 16 декабря 2010

Дайте мне посмотреть, смогу ли я задать этот вопрос разборчиво:

Я пишу 2D-движок на основе плиток в OpenGL ES с намерением сделать его похожим на растровый движок старой школы.Все мои художественные ресурсы имеют собственное разрешение (то есть 1: 1 пиксельное оформление) и отображаются на прямоугольные многоугольники, а мой вид OpenGL является ортогональным и охватывает прямоугольник (0,0, 0,0) до (screen.width, screen.height).).Я сделал это, надеясь, что каждый пиксель на дисплее будет соответствовать «виртуальному» квадрату пикселя в координатной плоскости XY, который, в свою очередь, будет соответствовать пикселю на одной из моих плиток.(Плитки имеют размер 16,0 x 16,0, и происхождение моего мира очевидно [0,0,0,0].)

Я был уверен, что мой движок будет выглядеть «фальшивым» из-за ошибок аппроксимации.Например, я подумал, что, поскольку пиксели плитки не записываются непосредственно на дисплей, иногда может быть получен неправильный пиксель.Я также был уверен, что при движении камеры OpenGL будет интерполироваться всякий раз, когда плитки не будут выровнены с фактическими пикселями дисплея.

Как оказалось, OpenGL ведет себя почти точно так же, как и растровый движок.Когда камера неподвижна, каждый виртуальный пиксель идеально соответствует пикселю на дисплее.Когда камера находится в движении, плитки «привязывают» один ряд пикселей / столбец за раз, а не перемещаются плавно посредством интерполяции.(Это происходит, даже если движение очень медленное.) Из любопытства я попытался увеличить свои плитки до 1.1x, и, как я и ожидал, они стали выглядеть грязными, и поведение привязки прекратилось.Правда ли, что OpenGL ведет себя по-разному в зависимости от того, может ли материал, который он отображает, быть идеально выровнен с дисплеем?

Где в спецификации я могу найти информацию об этих проблемах и как я могу гарантировать, что OpenGLпродолжает вести себя таким образом?Я чувствую себя некомфортно, используя стандартное значение, которое мне не совсем понятно, поскольку теоретически поведение может измениться в любое время.

Спасибо!

1 Ответ

3 голосов
/ 16 декабря 2010

Где в спецификации я могу найти информацию об этом поведении и как я могу убедиться, что OpenGL продолжает вести себя таким образом?

Вам необходимо прочитать всю главу "Растеризация" в спецификации. Он точно описывает, что гарантировано и как должна работать реализация OpenGL;

Мне неудобно использовать стандартное значение, которое я не совсем понимаю, поскольку поведение теоретически может измениться в любое время.

правый. Насколько я понимаю, в вашей ситуации поведение четко определено. Однако имейте в виду, что спецификация дает некоторую свободу реализации, поэтому результаты могут варьироваться от одной реализации к другой. Например, при масштабировании x1.1 или вращении сетки на 20 градусов точная ратификация ребер уже определена реализацией.

Обратите внимание, что ожидается "привязка". У вас не включен AA, поэтому OpenGL не может сделать движение более плавным.

...