試試這個片段,它會呈現一個從屏幕左下角開始的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);
}
我一直在嘗試一段時間,我還沒有得到#3的工作。我發現有幾個網站提供了一些使用glTexCoord的代碼(例如http://www.gaanza.com/blog/display-2d-sprite/),但所有渲染給我的是一個白色的矩形:https://gist.github.com/alecbenzer/5296913 – Alec
或者,這是_definitely_通過SDL進行字體渲染和形狀繪製的唯一方法嗎?是不是有一些方法可以將OpenGL用於形狀,還有其他一些SDL表面可以在這個表面上渲染,你可以將一個表面渲染到一個表面上? – Alec
SDL曾經支持過一種支持OpenGL渲染和表面傳輸的窗口。它已被棄用,因爲它在某些平臺/驅動程序中效果不佳。如果您對只能在電腦上工作的程序感到滿意(如果有的話),您可以嘗試將「SDL_OPENGLBLIT」傳遞給SDL_SetVideoMode。 – DanielKO