Как сделать текст в квадрате (4 вершины) в OpenGL? - PullRequest
1 голос
/ 07 апреля 2009

Я использую Linux и GLUT. У меня есть квадрат следующим образом:

glVertex3f(-1.0, +1.0, 0.0); // top left
glVertex3f(-1.0, -1.0, 0.0); // bottom left
glVertex3f(+1.0, -1.0, 0.0); // bottom right
glVertex3f(+1.0, +1.0, 0.0); // top right

Думаю, я не могу использовать glutBitmapCharacter, поскольку это идеально подходит только для 2D орто .

Достаточно просто, я хотел бы сделать "Hello world!" где-нибудь на указанной площади. Должен ли я создать текстуру и затем применить ее к вершинам, используя glTexCoord2f?

Ответы [ 2 ]

4 голосов
/ 07 апреля 2009

Самый простой способ - это загрузить карту шрифтов из изображения, например, сгенерированных конструктором растровых шрифтов (я знаю, что это окна, но я не могу найти их для linux), например: 1003 *

bitmap font example

Примером является gif 256x256, хотя вы можете преобразовать его в png / tga / bmp. Это полный ASCII сопоставленный Gird, 16x16 символов. Загрузите текстуру и используйте glTexCoord2f, чтобы выстроить ее в соответствие с вашим квадроциклом, и вам будет хорошо.

Вот пример использования растрового изображения из приведенного выше:

unsigned texture = 0;

void LoadTexture()
{
    // load 24-bit bitmap texture
    unsigned offset, width, height, size;
    char *buffer;
    FILE *file = fopen("text.bmp", "rb");
    if (file == NULL)
        return;
    fseek(file, 10, SEEK_SET);
    fread(&offset, 4, 1, file);
    fseek(file, 18, SEEK_SET);
    fread(&width, 1, 4, file);
    fread(&height, 1, 4, file);

    size = width * height * 3; 
    buffer = new char[size];

    fseek(file, offset, SEEK_SET);
    fread(buffer, 1, size, file);

    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, buffer);

    fclose(file);
    printf("Loaded\n");
}

void DrawCharacter(char c)
{
    int column = c % 16, row = c / 16;
    float x, y, inc = 1.f / 16.f;
    x = column * inc;
    y = 1 - (row * inc) - inc;

    glBegin(GL_QUADS);
      glTexCoord2f( x,       y);       glVertex3f( 0.f, 0.f, 0.f);
      glTexCoord2f( x,       y + inc); glVertex3f( 0.f, 1.f, 0.f);
      glTexCoord2f( x + inc, y + inc); glVertex3f( 1.f, 1.f, 0.f);
      glTexCoord2f( x + inc, y);       glVertex3f( 1.f, 0.f, 0.f);
    glEnd();
}
0 голосов
/ 07 апреля 2009

Действительно, рендеринг в растровое изображение - это решение. Есть достойное руководство по тому, как это сделать здесь на GameDev.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...