2012-06-18 51 views
1

目前我不太确定问题出在哪里。我可以将加载的图像作为纹理绘制,没有问题,但是当我尝试生成带有字符的位图时,我只是得到一个黑盒子。使用FreeType lib创建文本位图以在OpenGL 3.x中绘制

我相信问题在于当我生成并上传纹理时。

以下是对此的方法; if语句的顶部部分只是绘制了从文件(res/texture.jpg)加载的图像的纹理,并且完美地绘制了该纹理。 if语句的else部分将尝试生成并上传带有char(变量char输入)的纹理。

output

源代码,我会添加着色器,如果需要更多的C++的,但他们工作的优良形象。

void uploadTexture() 
    { 
     if(enter=='/'){ 

      // Draw the image. 
      GLenum imageFormat; 
      glimg::SingleImage image = glimg::loaders::stb::LoadFromFile("res/texture.jpg")->GetImage(0,0,0); 
      glimg::OpenGLPixelTransferParams params = glimg::GetUploadFormatType(image.GetFormat(), 0); 
      imageFormat = glimg::GetInternalFormat(image.GetFormat(),0); 

      glGenTextures(1,&textureBufferObject); 
      glBindTexture(GL_TEXTURE_2D, textureBufferObject); 

      glimg::Dimensions dimensions = image.GetDimensions(); 
      cout << "Texture dimensions w "<< dimensions.width << endl; 
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, dimensions.width, dimensions.height, 0, params.format, params.type, image.GetImageData()); 
     }else 
     { 
      // Draw the char useing the FreeType Lib 
      FT_Init_FreeType(&ft); 
      FT_New_Face(ft, "arial.ttf", 0, &face); 
      FT_Set_Pixel_Sizes(face, 0, 48); 

      FT_GlyphSlot g = face->glyph; 


      glGenTextures(1,&textureBufferObject); 
      glBindTexture(GL_TEXTURE_2D, textureBufferObject); 

      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

      FT_Load_Char(face, enter, FT_LOAD_RENDER); 
      FT_Bitmap theBitmap = g->bitmap; 

      int BitmapWidth = g->bitmap.width; 
      int BitmapHeight = g->bitmap.rows; 



      cout << "draw char - " << enter << endl; 
      cout << "g->bitmap.width - " << g->bitmap.width << endl; 
      cout << "g->bitmap.rows - " << g->bitmap.rows << endl; 

      int TextureWidth =roundUpToNextPowerOfTwo(g->bitmap.width); 
      int TextureHeight =roundUpToNextPowerOfTwo(g->bitmap.rows); 

      cout << "texture width x height - " << TextureWidth <<" x " << TextureHeight << endl; 

      GLubyte* TextureBuffer = new GLubyte[ TextureWidth * TextureWidth ]; 
      for(int j = 0; j < TextureHeight; ++j) 
      { 
       for(int i = 0; i < TextureWidth; ++i) 
       { 
        TextureBuffer[ j*TextureWidth + i ] = (j >= BitmapHeight || i >= BitmapWidth ? 0 : g->bitmap.buffer[ j*BitmapWidth + i ]); 
       } 
      } 

      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, TextureWidth, TextureHeight, 0, GL_RGB8, GL_UNSIGNED_BYTE, TextureBuffer); 
     } 

    } 
+0

只是为了仔细检查:您使用的是相同的代码路径,它使用GL_ALPHA纹理渲染“GL_RGB8”纹理,您想知道为什么没有获得任何颜色? – genpfault

+0

我已经将它们更改为GL_RGB8,但图像仍然存在问题。我将在上面的帖子中进行编辑。 – Andrew

回答

1

我不确定OpenGL的部分,但是你的算法来处理FT位图是不正确的。 FT位图中每行的字节数为bitmap->pitch。每个像素的数量还取决于您加载字符的渲染模式。例如,如果bitmap->pixel_modeFT_PIXEL_MODE_LCD,则按照R,G,B的顺序将每个像素编码为3个字节,并且这些值实际上是alpha掩模值,而如果像素模式是FT_PIXEL_MODE_GRAY,则每个像素是1个字节,并且值是灰色的。

看看http://freetype.sourceforge.net/freetype2/docs/reference/ft2-basic_types.html#FT_Bitmap

+0

即使是这样的情况下,我甚至会期望输出一个扭曲的纹理。 – Andrew

+0

您是否检查过FT位图中的缓冲区?他们是零吗? –

+0

不,我没有看过那个,我想这会显示问题出在哪一边......谢谢你的想法。和其他答复。 – Andrew

0

我会做的是看看返回码的第一件事是,FreeType给予几乎所有的FT_ *功能。

无论如何,这是一个很好的做法,但如果您遇到问题,应该大幅缩小范围。