0

我正在使用 SDL,我有 OpenGL 渲染设置,我想在屏幕上绘制一些文本。

我发现了这个问题:Using SDL_ttf with OpenGL这似乎解决了同样的问题,但我认为我的 GL-fu 不足以理解下一步该做什么。

即,我有texture来自另一篇文章的内容,如果我正确理解所有内容,它是一个整数 ID,表示包含渲染文本的 GL 纹理。我如何将这个纹理实际渲染到我的屏幕上(这里的一切都是 2D 的,所以我只想将它渲染为屏幕上的平面文本,而不是渲染到 3D 场景中的某个花哨的表面或任何东西上)。

或者,有没有更简单的方法可以让这个工作?(即,通过 SDL 渲染一些文本,同时也能够渲染 GL 形状)

编辑:或者,更一般地说,是否有一种更简单的方法可以通过 SDL 将文本和形状呈现到屏幕上?

4

2 回答 2

3
  1. 使用 SDL_ttf 将您的字符串转换为位图;这只是一个函数调用。

  2. 使用您发布的链接中的代码将其转换为纹理。

  3. 使用所述纹理绘制一个矩形。即glBindTexture,glBegin,(glTexCoord,glVertex)x4,glEnd。如果您对这一步有疑问,最好先阅读一些基本的 OpenGL 教程(当然包括纹理映射)。

于 2013-04-01T19:30:16.417 回答
0

试试这个片段,它从屏幕的左下角开始呈现一个 SDL true type 字体扩展库字体。

注意 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);
}
于 2015-01-23T00:03:10.673 回答