2013-10-30 6 views
3

저는 SDL2.0으로 작업 중이며 (세미 모던) OpenGL (3.1)을 사용하고 있습니다. 내 응용 프로그램에 텍스트 오버레이를 추가하고 응용 프로그램에서 TTF를 렌더링하려고합니다. 현대 OpenGL을 사용하면 어떻게 될까요?렌더링 TTF SDL2.0 opengl 3.1

편집 : genpfault의 제안으로 당 , 나는 SDL_TTF 라이브러리를 사용하여 시도했지만, 내가 갖는 모든 내가 매우 간단 내 쉐이더의 요지를 첨부 한 화면 http://i.stack.imgur.com/FqyCT.png 에 쓰레기 이 프로그램, 그리고 또한 표면에 텍스트를로드하고 텍스처에 바인딩하기 위해 사용하고 있습니다. 나는 전혀 미치지 못하도록하려는 것이 아닙니다. 내가 뭘 잘못보고 있니? 나는 질감을 채울 TTF_Render*() 호출에 의해 반환 등 쉐이더

https://gist.github.com/anonymous/7284430

답변

3

실제로 알파 채널에있는 텍스트 데이터를 알아 내기 전에 검은 스크린으로 너무 많은 시간을 보냈습니다.

GLuint shader_program_text; 

void drawText() 
{ 
    //Render the message to an SDL_Surface, as that's what TTF_RenderText_X returns 
    text_font = TTF_OpenFont("bpl_binary/waltographUI.ttf", 50); 
    SDL_Color color = {255, 0, 0, 0}; 
    SDL_Surface* sdl_surface = TTF_RenderText_Blended(text_font, "hello world", color); 
    GLuint texture_id; 
    glGenTextures(1, &texture_id); 
    glBindTexture(GL_TEXTURE_2D, texture_id); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sdl_surface->w, sdl_surface->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, sdl_surface->pixels); 
    glBindTexture(GL_TEXTURE_2D, 0); 
    SDL_FreeSurface(sdl_surface); 
    TTF_CloseFont(text_font); 

    //glDrawPixels(sdl_surface->w, sdl_surface->h, GL_RGBA, GL_UNSIGNED_BYTE, sdl_surface->pixels); 
    //FILE* file = fopen("output.txt", "w+"); 

    //for(int h=0; h<sdl_surface->h; h++) 
    //{ 
    // 
    // for(int w=0; w<sdl_surface->w; w++) 
    // { 
    //  unsigned int xxx = ((unsigned int*)sdl_surface->pixels)[h*sdl_surface->w + w]; 
    //  /*if(xxx != 0) 
    //   fprintf(file, "x", xxx); 
    //  else 
    //   fprintf(file, " ", xxx);*/ 
    //  fprintf(file, "%08x ", xxx); 
    // } 
    // fprintf(file, "\n"); 
    //} 

    //fclose(file); 

    //MULTIPLY WITH ALPHA TO ACTUALLY SEE SOMETHING 

    glUseProgram(shader_program_text); 
    glEnable(GL_TEXTURE_2D); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texture_id); 

    glBegin(GL_TRIANGLE_STRIP); 
    //texcoord; position; 
    glVertexAttrib2f(1, 0, 1); glVertexAttrib2f(0, -1, -1); //top left 
    glVertexAttrib2f(1, 1, 1); glVertexAttrib2f(0, +1, -1); //top right 
    glVertexAttrib2f(1, 0, 0); glVertexAttrib2f(0, -1, +1); //bottom left 
    glVertexAttrib2f(1, 1, 0); glVertexAttrib2f(0, +1, +1); //bottom right 
    glEnd(); 

    glDisable(GL_TEXTURE_2D); 
    glUseProgram(0); 
} 
+1

glBegin과 glEnd는 허용되지 않습니다 int OpenGL 3+ –

+0

흠 그렇다면 VBO 만 사용한다고 가정할까요? – ColacX

+0

VAO + VBO 예 : 단순히 일부 픽셀을 화면에 복사하기 위해 간단한 glDrawPixels (텍스처 만들기, VBO 만들기 및 쉐이더 만들기)로 수행했던 것과 동일한 코드를 수행해야합니다. 나는 더 쉬운 길을 찾고 있지만, 지금까지는 아무 것도 찾지 못했습니다. –

1

사용 the pixels member of the SDL_Surface를 디버깅하는 방법을 정말 너무 확실하지 않다.

+0

SDL_TTF 라이브러리를 사용하고있는 것 같습니까? 응답 주셔서 감사합니다, 나는 그것을 시도했지만 나는 그것에 대해별로 행운이 없습니다. –