从数据到OpenGL 2D纹理

时间:2015-04-27 19:58:44

标签: c opengl fonts true-type-fonts

我正在使用OpenGL 3.3上下文,而GLFW3则用于窗口化。我也在用C. 我正在使用STB_truetype将字符栅格化为动态分配的无符号字符。

我从STB_truetype获取数据:

unsigned char ttf_buffer[1<<25];
stbtt_fontinfo font;

fread(ttf_buffer, 1, 1<<25, fopen("Script Thing.ttf", "rb"));

stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0));

int w,h, xoff, yoff;
int c = 'C', s = 60;

unsigned char *bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, &xoff,&yoff);

为了确保我拥有正确的数据,我将其打印到控制台:

for(int i = 0; i < h; i++)
{
    for(int x = 0; x < w; x++)
    {
        printf("%c", bitmap[x+i*w]>>5 ? '1' : ' ');
    }
    printf("\n");
}

然后我创建2D OpenGL纹理:

glGenTextures(1,&Texture);
glBindTexture(GL_TEXTURE_2D, Texture);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
                    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
                    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RED, w,h,
            0, GL_RED, GL_UNSIGNED_BYTE, NewTemp );

我用'A'字符测试了它,我得到了:

                 11111      
                1111111     
               111111111    
              1111111111    
              11111111111   
             111111 11111   
            111111  11111   
            111111   1111   
           111111    1111   
           11111     1111   
          111111     1111   
     111111111111   11111   
   1111111111111111111111   
   111111111111111111111    
   111111111111111111111    
   111111111   1111111111   
       11111        111111  
       1111        11111111 
      11111        11111111 
      1111         11111111 
     1111          111  111 
     1111          111  1111
    1111          1111   111
    111           1111  111 
   111            111   111 
  1111            111  1111 
 1111             11111111  
1111              1111111   
 1                 111      

我渲染纹理OpenGL上下文:

enter image description here

你可以看到它是正确的。

然而,当我尝试C字符时:

              11       
          1111111111   
        1111111111111  
       111111111111111 
      11111111111111111
     1111111     111111
    111111        11111
   111111         1111 
   11111          1111 
  11111            11  
  1111                 
 11111                 
 1111                  
 1111                  
1111                   
1111                   
1111                   
1111                   
1111                   
111                    
111                    
1111                   
1111                   
 111                   
 1111                  
  1111              11 
  111111        11111  
   11111111111111111   
     111111111111      
          11   

enter image description here

与其他字符相同,例如'X':

        1111         1111 
        11111        11111
        11111       111111
        111111     111111 
         11111    1111111 
         11111   1111111  
         11111  1111111   
          1111 1111111    
          11111111111     
          1111111111      
          11111111        
          1111111         
          111111          
         111111           
        1111111           
       11111111           
      111111111           
     11111  1111          
    11111   1111          
   11111    1111          
   1111      1111         
  1111       1111         
 1111         111         
 111          1111        
111            111        
111            1111       
11              11111     
1111             11111    
 11                 1     

enter image description here

知道我可能做错了什么吗? 感谢。

编辑: 通过添加glPixelStorei(GL_UNPACK_ALIGNMENT,1)修复它; 就在glTexImage2D之前。 再次感谢 doron

0 个答案:

没有答案