2016-08-03 9 views
0

Я новичок в OpenGL, и я создал функцию для записи текста в OpenGL с использованием SDL_TTF. Вот код для моей функции:Текст в OpenGL с использованием SDL_TTF

#define WINDOW_WIDTH 832 
#define WINDOW_HEIGHT 487 
#define glVertex2px(x,y) glVertex2d((double)(x) * 2.0/(double)WINDOW_WIDTH - 1.0, 1.0 - (double)(y) * 2.0/(double)WINDOW_HEIGHT); 
void glWriteText2d(TTF_Font *font,const char *text,SDL_Color color,const int x,const int y){ 
    GLuint texture; 
    SDL_Surface *surface; 
    surface = TTF_RenderText_Blended(font,text,color); 
    glGenTextures(1,&texture); 
    glBindTexture(GL_TEXTURE_2D,texture); 
    gluBuild2DMipmaps(GL_TEXTURE_2D,4,surface->w,surface->h,GL_RGBA,GL_UNSIGNED_BYTE,surface->pixels); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); 
    GLboolean textureIsEnabled = glIsEnabled(GL_TEXTURE_2D); 
    glEnable(GL_TEXTURE_2D); 
    glColor3ub(255,255,255); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0,0); 
     glVertex2px(x,y); 
     glTexCoord2f(0,1); 
     glVertex2px(x,y + surface->h); 
     glTexCoord2f(1,1); 
     glVertex2px(x + surface->w,y + surface->h); 
     glTexCoord2f(1,0); 
     glVertex2px(x + surface->w,y); 
    glEnd(); 
    if(!textureIsEnabled){ 
     glDisable(GL_TEXTURE_2D); 
    } 
} 

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

+0

Извините, но я думаю, вы должны сначала узнать больше об OpenGL, прежде чем пытаться сделать то, что в настоящее время пытается. Прежде всего OpenGL не имеет встроенных текстовых функций, а также не современного OpenGL. Кроме того, вы не должны использовать этот старый OpenGL 1.1 с конвейером с фиксированной функцией. Это определенно совершенно не рекомендуется. И я никогда раньше не видел glVertex2px. И я не могу найти что-то об этом. Поэтому, наконец, трудно сказать, что не так из этого контекста, без дополнительной информации. Возможно, вы неправильно настроили матрицу Modelview/Projection, чтобы увидеть только небольшую часть целого? – Michael

+0

@Michael О 'glVertex2px', это макрос, который я сделал сам, который рисует вещи, используя количество пикселей в верхнем левом углу окна, как в SDL. В 2D я считаю это более практичным. Я забыл включить его определение в код, но я отредактировал, чтобы исправить это. –

ответ

2

Полученная текстура заполнена сплошным цветом. То, что заставляет его формировать текст, является альфа-каналом, но у вас нет альфа-смешивания, поэтому вы его не видите. Добавить

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

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

Также обратите внимание, что вы не освободили ни сгенерированный SDL_Surface, ни GL текстуры; таким образом вы быстро исчерпаете память. Текстура может быть повторно использована, и SDL_Surface может быть освобожден, как только вы скопируете данные в текстуру GL.