2012-06-18 89 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_ *功能。

無論如何,這是一個很好的做法,但如果您遇到問題,應該大幅縮小範圍。