Создание листа бумаги с текстом в OpenGL (в частности, на iOS 5)

Я никогда не работал с OpenGL, но я ищу советы по этому конкретному вопросу в приложении AR, с которым я практикуюсь.

Я хотел бы сделать приложение с «плоским прямоугольником» вместе с текстом, написанным на поверхности прямоугольника. Визуально я представляю что-то вроде листа бумаги с написанным на нем текстом. Каждый раз, когда приложение запускается, текст будет другим (текст извлекается из файла plist).

Пользователь сможет просматривать бумагу со всех сторон, как будто перед ним висит лист бумаги.

Это тривиально сделать в OpenGL? Как я мог начать?

Извините за действительно открытый вопрос, но я хотел понять, как это делается.

Глядя на исходный код шаблона OpenGL в примерах проектов Xcode, я вижу большой массив вершин. Я предполагаю, что для создания «плоского» прямоугольника мне, по сути, просто нужно удалить или сделать ось Z нулевой. А затем динамический текст, который будет прикреплен к поверхности плоского прямоугольника... Я понятия не имею, как это сделать......


person kurisukun    schedule 27.10.2011    source источник


Ответы (1)


На этот вопрос трудно ответить однозначно. В общем, это банально, но опять же не так.

Рисование «плоского прямоугольника с чем-то на нем» — это пара вызовов API, настолько простых, насколько это возможно. Рисование текста в OpenGL эффективным способом, с высоким качеством и без предварительной обработки — это совсем другая история.

Что бы я сделал, так это отрисовал бы текст, используя любой «обычный поддерживаемый системой» способ в iOS (точно так же, как вы рисуете в любом окне, я бы не знал этой конкретной детали), но рисовал бы в растровое изображение а не на экране. Это должно поддерживаться, почти каждая ОС поддерживает это как минимум 10-15 лет. Затем превратите это растровое изображение в текстуру, привяжите его и нарисуйте свой тривиальный плоский четырехугольник с помощью OpenGL (настройте буфер вершин с 4 вершинами, каждая вершина — координата текстуры, и нарисуйте два треугольника — настолько просто, насколько это возможно).

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

Теперь все становится сложнее, если ваш «кусок бумаги» тоже должен сгибаться и скручиваться или делать эффект отслаивания страницы, а не просто плоский прямоугольник. В этом случае вам нужно разбить его на мозаику, что тоже может быть сложнее, чем кажется. Не все тесселяции выглядят оптимальными для всех изгибов/поворотов, или они имеют оптимальное (читай как минимум) количество вершин.

В одной из книг по GPU Gems или GPU Pro есть статья о "отслоении страницы" и такой тесселяции, позвольте мне поискать...

Там: Андреас Биззотто: «Шейдерная программа для чтения электронных книг — эффект отслоения страницы», GPU Pro2, стр. 278–299

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

person Damon    schedule 27.10.2011