OPENGL ES 2.0 Рендеринг текста на экране - PullRequest
1 голос
/ 07 июня 2011

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

Я наткнулся на код OPENGL ES 1.1, в котором есть следующие строки.

Файл: в GLViewController.m (из функции drawView)

Texture2D *textTex = [[Texture2D alloc] initWithString:@"Text" 

                                            dimensions:CGSizeMake(100., 40.0) 

                                             alignment:UITextAlignmentCenter 

                                                  font:[UIFont boldSystemFontOfSize:10.0]];

[textTex drawAtPoint:CGPointMake(160.0, 100.0) depth:-1];

В файле Texture2D.m,

- (void) drawAtPoint:(CGPoint)point depth:(CGFloat)depth

{

GLfloat coordinates[] = {

0, _maxT,

_maxS, _maxT,

0, 0,

_maxS, 0

};

GLfloat width = (GLfloat)_width * _maxS,

height = (GLfloat)_height * _maxT;

GLfloat vertices[] = {

-width / 2 + point.x, -height / 2 + point.y, depth,

width / 2 + point.x, -height / 2 + point.y, depth,

-width / 2 + point.x, height / 2 + point.y, depth,

width / 2 + point.x, height / 2 + point.y, depth

};

glBindTexture(GL_TEXTURE_2D, texture.name);

glVertexPointer(3, GL_FLOAT, 0, vertices);          //1

glTexCoordPointer(2, GL_FLOAT, 0, coordinates);      //2

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

}

Когда я пытался преобразовать этот код в код OPENGL ES 2.0, я не смог найти подходящего преобразования для строк, отмеченных 1 и 2. Может ли кто-нибудь помочь мне преобразовать этот код в код OPENGL ES 2.0?

Или, если кто-нибудь знает о более простом способе написания текста на экране, сообщите мне.

1 Ответ

2 голосов
/ 07 июня 2011

OpenGL ES 1.x и 2.x имеют много общих понятий, когда речь идет о геометрии.Вы указываете вершины, затем соединяете их с геометрией, которая превращается в пиксели.Разница заключается в том, что вы задаете пользовательский код в двух местах: взять входную геометрию и выяснить, куда он идет на экране и какие материалы он передает по конвейеру, и выяснить, какой цвет отдельных фрагментов основан на поступающей информации.вдоль конвейера.

Поскольку ES 1.x не был программируем в этом смысле, он имел фиксированную функциональность в обоих местах.Это означало фиксированные структуры данных и, следовательно, почему вы предоставляете данные через glVertexPointer, glTexCoordPointer и т. Д. Вы предоставляете значения для фиксированных, заранее определенных полей, которые OpenGL записал в камень как описание вершины.

Поскольку ES 2.x полностью программируемый и минималистичный, он не делает никаких предположений о том, какие поля описывают вершину, и, соответственно, не имеет специальных методов предоставления данных, таких как один для предоставления местоположений (glVertexPointer), другой для предоставления координат текстуры (glTexCoordPointer) и т. Д.

В ES 2.x вы используете glVertexAttribPointer для замены всех фиксированных значений вызовов ES 1.x.Первый параметр определяет, какой атрибут вы указываете по индексу, этот индекс был вызван вами самим с помощью glBindAttribLocation или оставлен, чтобы выяснить себя и запросить обратно с помощью glGetAttribLocation.

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

Возможно, у вас есть какая-то основа для работы с этим материалом в ваших графиках.Поскольку ES 2.x настолько универсален в отношении атрибутов, должна быть возможность многократно использовать один и тот же материал.

...