2013-04-01 52 views
0

我正在使用SDL,我有OpenGL渲染設置,我想在屏幕上繪製一些文本。使用SDL將文本繪製到OpenGL表面上

我發現這個問題:Using SDL_ttf with OpenGL似乎解決了同樣的問題,但我認爲我的GL-fu不足以理解接下來要做什麼。

也就是說,我從該另一個帖子中獲得texture,如果我正確地理解了所有內容,它是一個表示包含渲染文本的GL紋理的整數ID。我該如何將這種紋理渲染到屏幕上(這裏所有的2D都是2D,所以我只想將它作爲平面文本呈現在屏幕上,而不是渲染到3D場景或任何其他任何奇特的表面上)。

另外,有沒有更容易的方法來獲得這個工作? (即,通過SDL呈現一些文本,同時還能呈現GL形狀)

編輯:或者,更普遍的是,是否有更簡單的方法可以通過SDL將文本和圖形呈現到屏幕上?

回答

3
  1. 使用SDL_ttf將您的字符串轉換爲位圖;這只是一個單一的函數調用。

  2. 使用您發佈的鏈接中的代碼將其變爲紋理。

  3. 使用上述紋理繪製一個矩形。也就是說,glBindTexture,glBegin,(glTexCoord,glVertex)x4,glEnd。如果您對這一步有疑問,您最好先瀏覽一些基本的OpenGL教程(當然包括紋理映射)。

+0

我一直在嘗試一段時間,我還沒有得到#3的工作。我發現有幾個網站提供了一些使用glTexCoord的代碼(例如http://www.gaanza.com/blog/display-2d-sprite/),但所有渲染給我的是一個白色的矩形:https://gist.github.com/alecbenzer/5296913 – Alec

+0

或者,這是_definitely_通過SDL進行字體渲染和形狀繪製的唯一方法嗎?是不是有一些方法可以將OpenGL用於形狀,還有其他一些SDL表面可以在這個表面上渲染,你可以將一個表面渲染到一個表面上? – Alec

+0

SDL曾經支持過一種支持OpenGL渲染和表面傳輸的窗口。它已被棄用,因爲它在某些平臺/驅動程序中效果不佳。如果您對只能在電腦上工作的程序感到滿意(如果有的話),您可以嘗試將「SDL_OPENGLBLIT」傳遞給SDL_SetVideoMode。 – DanielKO

0

試試這個片段,它會呈現一個從屏幕左下角開始的SDL真正型字體擴展庫字體。

請注意將texcords排列成屏幕上的形狀。文本紋理中的像素從圖像左上角的0,0開始。所以我需要將其左右翻轉,以便在左下方的x,y屏幕上正確顯示。

void RenderText(std::string message, SDL_Color color, int x, int y, 
       TTF_Font* font) 
{ 

    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    glLoadIdentity(); 

    gluOrtho2D(0, gWindow->getWidth(),0,gWindow->getHeight()); 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 

    glDisable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    GLuint texture; 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 

    SDL_Surface * sFont = TTF_RenderText_Blended(font, message.c_str(), color); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sFont->w, sFont->h, 0, GL_BGRA, 
       GL_UNSIGNED_BYTE, sFont->pixels); 

    glBegin(GL_QUADS); 
    { 
    glTexCoord2f(0,1); glVertex2f(x, y); 
    glTexCoord2f(1,1); glVertex2f(x + sFont->w, y); 
    glTexCoord2f(1,0); glVertex2f(x + sFont->w, y + sFont->h); 
    glTexCoord2f(0,0); glVertex2f(x, y + sFont->h); 
    } 
    glEnd(); 

    glDisable(GL_BLEND); 
    glDisable(GL_TEXTURE_2D); 
    glEnable(GL_DEPTH_TEST); 

    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 

    glDeleteTextures(1, &texture); 
    SDL_FreeSurface(sFont); 
}