2D рисование в OpenGL ES 2.0 (iOS) - PullRequest
       44

2D рисование в OpenGL ES 2.0 (iOS)

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

Я учусь использовать OpenGL ES 2.0 на iOS. Сейчас я хочу сделать простую 2D-анимацию (например, переместить прямоугольник по экрану и изменить его размер). Я начал с шаблона проекта для OpenGL ES, предоставленного Apple в Xcode. Мой код рисования выглядит так:

static GLfloat squareVertices[] = {
    -0.5f, -0.33f,
    0.5f, -0.33f,
    -0.5f,  0.33f,
    0.5f,  0.33f
 };

// Update attribute values.
glVertexAttribPointer(VERTEX_ATTR, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(VERTEX_ATTR);

glVertexAttribPointer(COLOR_ATTR, 4, GL_UNSIGNED_BYTE, 1, 0, squareColors);
glEnableVertexAttribArray(COLOR_ATTR);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);

Теперь нарисуем красивый прямоугольник в середине экрана. Но если я начну менять прямоугольник, добавив следующий код, он начнет выглядеть так: выглядит как фанк :

squareVertices[5] -= .001;
squareVertices[7] -= .001;

Как будто часть прямоугольника прикреплена к центру экрана. Я совершенно новичок в OpenGL ES, поэтому я уверен, что моя проблема очевидна. Я также предполагаю, что это как-то связано с тем, что OpenGL ES является библиотекой 3D-графики, и я пытаюсь рассматривать ее как 2D-пространство. Итак, мой вопрос: как лучше всего рисовать и анимировать 2D-объекты в OpenGL ES 2.0? Я видел некоторые вещи в Интернете для OpenGL ES 1.1, но это не сильно мне помогает. Являются ли их специальные методы для 2D-рисования в OpenGL ES 2.0, или есть какой-то режим 2D-рисования?

Любое руководство будет с благодарностью.

Ответы [ 4 ]

6 голосов
/ 03 сентября 2011

@ macinjosh: Это ответ на ваш обновленный вопрос для тех, кто заинтересован в ответе. Я предполагаю, что вы приобрели дополнительные знания с декабря 10 года, когда вы отправили!

Вершины OpenGL в 3D, а не в 2D. Чтобы быть полностью правдивыми, они на самом деле в 4D, поскольку они также включают в себя компонент 'w', но сейчас просто рассмотрим это как значение 1.0 как однородный вектор.

Из-за их трехмерности, если вы не добавляете компонент 'z' в шейдер, вы должны указать его как атрибут вершины.

2 голосов
/ 09 февраля 2011

Я новичок в OpenGL, но вершина не требует 3 поплавков, по одному на каждый топор: X, Y, Z?

Итак, первый массив вершин будет:

( -0.50f, -0.33f, 0.50f) 
( -0.33f, -0.50f, 0.33f)
(  0.50f,  0.33f, ?????)

второй будет:

( -0.50f, -0.33f, 0.00f )
(  0.50f, -0.33f, 0.00f )
( -0.50f,  0.33f, 0.00f )
(  0.50f,  0.33f, 0.00f )

Я ДЕЙСТВИТЕЛЬНО новичок, так что не воспринимайте меня слишком серьезно ...:)

Кстати, это лучший источник знаний об OpenGL, который я нашел:

http://iphonedevelopment.blogspot.com/2010/10/opengl-es-20-for-ios-chapter-3.html

Надеюсь, этот ответ имеет смысл ...

2 голосов
/ 04 марта 2011

Потому что у вас есть «3» в качестве третьего параметра glVertexAttribPointer. Я считаю, что вы можете установить его на 2, но я не пробовал это в GL. Я предполагаю, что отсутствующая ось z будет заполнена внутри как «0» (но, опять же, попробуйте и посмотрите!). Внутренне, вероятно, все это будет 4 векторами с плавающей запятой с 4-ым ('w') параметром, используемым для гомбинных умножений матриц.

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

glInterleavedArrays(format_code, stride, data)

может оказаться более эффективным, поскольку устройство может оптимизировать пути кода для любого «format_code», который вы решите использовать.

1 голос
/ 26 декабря 2010

После некоторой игры я изменил код рисования так:

static GLfloat squareVertices[12] = {
    -0.5f, -0.33f, 0.0,
    0.5f, -0.33f, 0.0,
    -0.5f, 0.33f, 0.0,
    0.5f, 0.33f, 0.0
};

// Update attribute values.
glVertexAttribPointer(VERTEX_ATTR, 3, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(VERTEX_ATTR);

glVertexAttribPointer(COLOR_ATTR, 4, GL_UNSIGNED_BYTE, 1, 0, squareColors);
glEnableVertexAttribArray(COLOR_ATTR);

squareVertices[7] -= .001;
squareVertices[10] -= .001;

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Добавление третьего числа с плавающей запятой в каждую вершину, похоже, помогло.Мне неясно, почему это так, если кто-то может пролить свет, я буду признателен за это.

...