2016-08-03 11 views
0

저는 OpenGL의 초보자이며 OpenGL에서 SDL_TTF를 사용하여 텍스트를 작성하는 함수를 만들었습니다.SDL_TTF를 사용하는 OpenGL의 텍스트

#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 텍스처도 생성되지 않았습니다. 그런 식으로 당신은 빨리 추리 할 것입니다. 텍스처를 다시 사용할 수 있으며 GL 텍스처에 데이터를 복사하자 마자 SDL_Surface가 해제 될 수 있습니다.