Подтвердить что ты не робот

Есть ли достойная библиотека для рисования OpenGL для iPhone SDK?

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

Я слышал некоторые хорошие вещи о freetype, но нашел очень мало о том, как заставить его работать на iPhone, и кажется, что он довольно сложный.

Итак, есть ли Objective-C обернутая текстовая библиотека OpenGL, которая работает с iPhone SDK, который люди использовали? Или я просто думаю об этом, и есть более легкий подход, который мне не хватает?

4b9b3361

Ответ 1

Ваше описание использования freetype для создания атласа текстуры вместе со всей информацией о глифе является именно тем, что я делаю в текущем проекте iPhone.

Я делаю все разбор шрифта на этапе предварительного процесса (все в С# в Windows, когда это происходит). Сам атлас генерируется и содержит только необходимые символы - чтобы сократить пространство, я также иногда получаю больше, чем один атлас, чтобы сохранить размеры текстур pow2 и разумное разрешение.

Вы можете легко вывести информацию о символах из freetype. Передайте это вместе со своим приложением вместе с текстурами во время выполнения, а затем довольно просто, чтобы просто изменить УФ-координаты текстуры по мере необходимости.

Для чего это стоит, так я определяю символ глифа внутри моего маленького движка:

struct FontGlyph
{

u32 char_code;

u32 m_x;                // base x position on tpage

u32 m_y;            // base y position on tpage

u32 m_width;            // glyph width

u32 m_height;           // glyph height

i32 m_horiBearingX;     // Distance to X shift

i32 m_horiBearingY;     // Distance to Y shift

u32 m_horiAdvance;      // Total Horizontal advance this character requires

u32 m__tpage_index;     // Which tpage does this glyph use?

};

Затем у меня есть объект "SpriteString", который ведет себя почти как любая другая строка, кроме того, что я могу рисовать его с помощью спрайтов....

Я согласен, что все может показаться большой работой для довольно тривиальной проблемы, но я нашел, что это дало мне много гибкости и на самом деле так долго не выполнялось, когда я приступил к ней.

Не стесняйтесь отвечать или комментировать, если вам нужны какие-либо другие детали. (И удачи:)


Ответьте на свой комментарий, когда я закончил комнату в разделе комментариев...

Посмотрите документацию по freetype, она в основном дает вам данные глифов без возиться, просто вытаскивает ее прямо из шрифта. Что касается самих текстур, вы получаете freetype для отображения каждого глифа, а затем управляете этим, чтобы построить текстуру. Это я делаю как предварительный процесс, полностью отделенный от основного приложения.

Вот фрагмент кода моего инструмента, который делает это: http://pastebin.com/md1c6354

Обратите внимание, что это было предназначено только для моих глаз, а не для общественного потребления, поэтому извините, что это грязно, как ад:)

Ответ 2

Один из способов сделать это - настроить UILabel, а затем превратить его слой в текстуру. Косвенным направлением для этого было бы сначала настроить UILabel с текстом, шрифтом и т.д., А затем использовать следующий код

UIGraphicsBeginImageContext(yourLabel.frame.size);
[yourLabel.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *layerImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

чтобы захватить UILabel в UIImage. Затем вы можете использовать initWithImage: конструктор класса Texture2D в проекте CrashLanding, чтобы преобразовать его в текстуру.

Похоже, что initWithImage: в этом примере переопределяет UIImage в контексте растрового изображения и использует его для создания текстуры. С небольшой работой вы можете извлечь соответствующий код из этого метода и изменить приведенный выше код, чтобы отобразить ваш слой непосредственно в текстуре.

Таким образом, вы получаете приятную поддержку Unicode и шрифтов UILabel при создании текста для вашей текстуры.

Ответ 3

Я нашел простое решение. Вот быстрая функция, которую я написал для нее. (Вам понадобится класс Texture2D.)

- (void) drawText:(NSString*)theString AtX:(float)X Y:(float)Y {
// Use black
glColor4f(0, 0, 0, 1.0);

// Set up texture
Texture2D* statusTexture = [[Texture2D alloc] initWithString:theString dimensions:CGSizeMake(150, 150) alignment:UITextAlignmentLeft fontName:@"Helvetica" fontSize:11];

// Bind texture
glBindTexture(GL_TEXTURE_2D, [statusTexture name]);

// Enable modes needed for drawing
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

// Draw
[statusTexture drawInRect:CGRectMake(X,Y-1,1,1)];   

// Disable modes so they don't interfere with other parts of the program
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);    
}

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

Ответ 4

Спасибо за этот метод. Это спасло меня некоторое время.

Там было несколько вещей, которые мне пришлось изменить. Вызов glBlendFunc должен быть:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA)

И, во-вторых, текст, казалось, рисовал в одну точку. Вызов CGRectMake создает прямоугольник 1x1, если я не читаю это неправильно.

Ответ 5

Используйте библиотеку шрифтов "musings":

http://www.themusingsofalostprogrammer.com/2010/01/how-to-do-font-rendering-in-opengl-on.html

Font font("Verdena");
font.print("Hello World!", x, y, z);

Просто:)

Он поставляется с поддержкой Unicode, загружает глифы "по требованию" и даже имеет способ вывода переменных

font.print(x, y, z) << "fps: " << fps;

Ответ 6

Я создал класс Font, подобный библиотеке шрифтов "musings", минус утечки памяти и минус создание текстуры для каждого символа, каждого кадра. Тем не менее, он по-прежнему использует другую glTexture для каждого символа. Примечание. Texture2D был изменен, чтобы прокомментировать его удаление текстуры.

init в конструкторе: _font = new Font("Helvetica", 40);

использовать метод redraw(): _font->draw("Hello, World!", 50, 100, ALIGN_LEFT);

Ссылка GitHub:

https://github.com/chandl34/public/tree/master/personal/c%2B%2B/Font

Ответ 7

Проверьте демоверсию приземления. Предоставляемый класс Texture2D позволяет создавать текстуры с текстом и шрифтом. (Надеюсь, что будет лучший ответ, который мне понравился бы более простой способ рисования в режиме opengles)

Ответ 8

Да, есть 2, которые я знаю о. Фокус в том, что вы должны визуализировать текстуру с помощью функций Quartz (CGContext *), а затем визуализировать эту текстуру для просмотра пользователем.

Если вы обеспокоены производительностью, вы также можете использовать Quartz для создания вашего атласа текстуры.

Довольно легко взломать инструмент генерации текстуры (в xCode) как только вы узнаете основы визуализации шрифта.

Все, что вам нужно сделать, это иметь действительный CGContext. Вы можете найти действительно отличный образец кода в этом загрузчике текстур.

В основном код идет:

// Create the cgcontext as shown by links above

// Now to render text into the cg context,
// the drop the raw data behind the cgcontext
// to opengl.  2 ways to do this:
// 1)  CG* way: (advantage: easy to use color)
CGContextSelectFont(cgContext, "Arial", 24, kCGEncodingMacRoman);

// set color to yellow text
CGContextSetRGBFillColor(cgContext, 1, 1, 0, 1) ; // Be sure to use FILL not stroke!

// draw it in there
CGContextShowTextAtPoint(cgContext, 20, 20, "HI THERE", strlen("HI THERE") ) ;

/*
// WAY #2:  this way it always black and white
// DRAW SOME TEXT IN IT
// that works ok but let try cg to control color
UIGraphicsPushContext(cgContext);
UIFont *helv = [UIFont fontWithName:@"Helvetica" size:[UIFont systemFontSize]];
NSString* msg = @"Hi hello" ;  
[msg drawInRect:CGRectMake(0,0,pow2Width,pow2Height) withFont:helv] ;
    UIGraphicsPopContext();
*/

// put imData into OpenGL memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pow2Width, pow2Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imData);
CHECK_GL ;

Он выглядит довольно неплохо и сглажен,

tex atlas

Список шрифтов ios доступен здесь и prerenders здесь