Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SDL2和x2B;OpenGL&x2B;SDL2_TTF:显示文本_C++_Opengl_Rendering_Sdl 2_Sdl Ttf - Fatal编程技术网

C++ SDL2和x2B;OpenGL&x2B;SDL2_TTF:显示文本

C++ SDL2和x2B;OpenGL&x2B;SDL2_TTF:显示文本,c++,opengl,rendering,sdl-2,sdl-ttf,C++,Opengl,Rendering,Sdl 2,Sdl Ttf,我在OpenGL plus SDL2.0中绘制TTF字体时遇到问题 我记得在SDL版本2之前,我没有遇到任何问题,但似乎缺少关于这个主题的文档,可能是由于新标准的缘故 我已经包含了下面的代码来大致说明我在做什么 这段代码效率很低,因为我每帧都重新创建纹理,如果复制+粘贴,请考虑这一点:) void main_render(){ glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位); //将颜色设置回白色(全纹理颜色) GL3F(1.0f,1.0f,1.0f); 主摄像头->透视();

我在OpenGL plus SDL2.0中绘制TTF字体时遇到问题

我记得在SDL版本2之前,我没有遇到任何问题,但似乎缺少关于这个主题的文档,可能是由于新标准的缘故

我已经包含了下面的代码来大致说明我在做什么

这段代码效率很低,因为我每帧都重新创建纹理,如果复制+粘贴,请考虑这一点:)

void main_render(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//将颜色设置回白色(全纹理颜色)
GL3F(1.0f,1.0f,1.0f);
主摄像头->透视();
mainCamera->translate();
//加载字体
TTF_Font*Font=TTF_OpenFont(“../resource/Font.TTF”,10);
如果(字体==nullptr){

std::cout所以OpenGL要求我的系统上所有纹理的尺寸都是Base2(2,4,16,32,64…)

我通过增量搜索与原始维度最接近的二次幂来修复此问题:

  unsigned int power_two_floor(unsigned int val) {
    unsigned int power = 2, nextVal = power*2;

    while((nextVal *= 2) <= val)
      power*=2;

    return power*2;
  }
需要添加过滤器信息才能更正OpenGL使用mipmaps的错误:

 //Avoid mipmap filtering
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
以下是我的答案:

unsigned int power_two_floor(unsigned int val) {
  unsigned int power = 2, nextVal = power*2;
  while((nextVal *= 2) <= val)
    power*=2;
  return power*2;
}

void main_render() {
  //Load the font
  TTF_Font *font = TTF_OpenFont("../resource/font.ttf", 10);
  if (font == nullptr) {
    std::cout << "TTF_OpenFont error: " << std::endl;
    return;
  }

  SDL_Color colorFg = {0,0,255};
  SDL_Surface *surface;

  //Render font to a SDL_Surface
  if ((surface = TTF_RenderText_Blended(font, "Hi!", colorFg)) == nullptr) {
    TTF_CloseFont(font);
    std::cout << "TTF_RenderText error: " << std::endl;
    return;
  }

  GLuint texId;

  //Generate OpenGL texture
  glEnable(GL_TEXTURE_2D);
  glGenTextures(1, &texId);
  glBindTexture(GL_TEXTURE_2D, texId);

  //Avoid mipmap filtering
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

  //Find the first power of two for OpenGL image 
  int w = power_two_floor(surface->w)*2;
  int h = power_two_floor(surface->h)*2;

  //Create a surface to the correct size in RGB format, and copy the old image
  SDL_Surface * s = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000,0x0000ff00,0x000000ff,0xff000000);
  SDL_BlitSurface(surface, NULL, s, NULL);

  //Copy the created image into OpenGL format
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, s->pixels);

  //Draw the OpenGL texture as a Quad
  glBegin(GL_QUADS); {
    glTexCoord2d(0, 1); glVertex3f(0,              0,              0);
    glTexCoord2d(1, 1); glVertex3f(0 + surface->w, 0,              0);
    glTexCoord2d(1, 0); glVertex3f(0 + surface->w, 0 + surface->h, 0);
    glTexCoord2d(0, 0); glVertex3f(0,              0 + surface->h, 0); 
  } glEnd();
  glDisable(GL_TEXTURE_2D);

  //Cleanup
  TTF_CloseFont(font);
  SDL_FreeSurface(s);
  SDL_FreeSurface(surface);
  glDeleteTextures(1, &texId);
}
unsigned int power\u two\u floor(unsigned int val){
无符号整数幂=2,nextVal=幂*2;
而((nextVal*=2)w,0+表面->h,0);
glTexCoord2d(0,0);glVertex3f(0,0+表面->h,0);
}格伦德();
glDisable(GL_纹理_2D);
//清理
TTF_关闭字体(字体);
SDL_自由曲面(s);
SDL_自由曲面(曲面);
glDeleteTextures(1,&texId);
}
 //Avoid mipmap filtering
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
unsigned int power_two_floor(unsigned int val) {
  unsigned int power = 2, nextVal = power*2;
  while((nextVal *= 2) <= val)
    power*=2;
  return power*2;
}

void main_render() {
  //Load the font
  TTF_Font *font = TTF_OpenFont("../resource/font.ttf", 10);
  if (font == nullptr) {
    std::cout << "TTF_OpenFont error: " << std::endl;
    return;
  }

  SDL_Color colorFg = {0,0,255};
  SDL_Surface *surface;

  //Render font to a SDL_Surface
  if ((surface = TTF_RenderText_Blended(font, "Hi!", colorFg)) == nullptr) {
    TTF_CloseFont(font);
    std::cout << "TTF_RenderText error: " << std::endl;
    return;
  }

  GLuint texId;

  //Generate OpenGL texture
  glEnable(GL_TEXTURE_2D);
  glGenTextures(1, &texId);
  glBindTexture(GL_TEXTURE_2D, texId);

  //Avoid mipmap filtering
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

  //Find the first power of two for OpenGL image 
  int w = power_two_floor(surface->w)*2;
  int h = power_two_floor(surface->h)*2;

  //Create a surface to the correct size in RGB format, and copy the old image
  SDL_Surface * s = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000,0x0000ff00,0x000000ff,0xff000000);
  SDL_BlitSurface(surface, NULL, s, NULL);

  //Copy the created image into OpenGL format
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, s->pixels);

  //Draw the OpenGL texture as a Quad
  glBegin(GL_QUADS); {
    glTexCoord2d(0, 1); glVertex3f(0,              0,              0);
    glTexCoord2d(1, 1); glVertex3f(0 + surface->w, 0,              0);
    glTexCoord2d(1, 0); glVertex3f(0 + surface->w, 0 + surface->h, 0);
    glTexCoord2d(0, 0); glVertex3f(0,              0 + surface->h, 0); 
  } glEnd();
  glDisable(GL_TEXTURE_2D);

  //Cleanup
  TTF_CloseFont(font);
  SDL_FreeSurface(s);
  SDL_FreeSurface(surface);
  glDeleteTextures(1, &texId);
}