От чего зависят размеры экранной сетки в OpenGL ES 2.0? (используя C ++) - PullRequest
1 голос
/ 10 марта 2012

В качестве отправной точки я использую несколько демонстраций, поставляемых с моим эмулятором OpenGL ES.Демонстрация, которую я сейчас использую, - это 960x540 пикселей с простым 2D-треугольником, нарисованным в середине экрана.

Я вижу, что треугольник нарисован с плавающей точкой, и что левый нижний угол экранаравен (-1, -1), а в верхнем правом углу экрана (1,1).

Возможно ли это изменить?Я хотел бы использовать целые числа вместо чисел с плавающей точкой, и иметь левый нижний угол экрана (1,1), а правый верхний угол (960 540).

Это было бы намного проще работатьс, потому что я планирую сделать 2D платформерную игру.Я не хочу делить пиксели в этой игре;все (текстуры, движение игрока, движение камеры) будет соответствовать координатам целого пикселя.

Я попытался сжать числа (используя обычную сетку и плавающие элементы), чтобы нарисовать прямоугольный треугольник размером 24x24 пикселей.Тем не менее, на экране получилось 24x23 пикселя.Поэтому я не хотел продолжать идти вперед, если бы существовал более точный и быстрый метод, который мог бы использовать пиксельные координаты.

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Вы можете применить соответствующее преобразование, используя матрицу ортогональной проекции с экстентами, установленными в вашем разрешении.

Как сделать такие матрицы: http://db -in.com / blog / 2011/04 /camera-on-opengl-es-2-x /

Применение этого преобразования в вершинном шейдере позволяет напрямую указывать координаты пикселей в данных вершины.

Сложная частьчто пиксели ( центр из них) в этом случае не располагаются целыми числами!Это то, где вещи обычно становятся нечетными => соответствующий поисковый термин может быть «OpenGL с идеальным пикселем».

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

Если вы хотите предоставить нормализованные координаты, {-1, -1} - {1,1}, как вы делаете это сейчас (я не рекомендую):

vec2 pixelSize         = 2.0 / vec2(viewportWidth,viewportHeight);
vec2 halfPixelSize     = 1.0 / vec2(viewportWidth,viewportHeight);
vec2 pixelPerfectCoord = round(coord,pixelSize) + halfPixelSize
0 голосов
/ 10 марта 2012

Значения, выходящие из вершинного шейдера, должны быть готовы для проецирования в обычное глазное пространство OpenGL, но вам не нужно передавать вершины в этом пространстве.В ES 1 вы бы настроили стек проекций;у вашей демоверсии есть аналог?

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

Цель состоит в том, чтобы OpenGL не рисовал пиксели дважды, когда геометрия встречается на краю.

Учитывая это, треугольник может иметь высоту ровно 24 пикселя, но если он идет отот центра одного пикселя к центру другого он будет рисовать только [максимум] 23 строки.Так что ваша математика уже может быть правильной.Рассмотрим один многоугольник от y = 0 до y = 24 и один от y = 24 до y = 36 - вы не хотите, чтобы они оба рисовали при y = 24, тем более что они могут быть частично прозрачными.

...