我是否将错误的数据传递给 glTexImage2D?

切雷斯特斯·拉杜

我正在尝试通过使用烘焙字体中的数据填充像素缓冲区来制作 OpenGL 纹理。我从字体数组中获取每个值并基本上制作位图。问题是当我显示完整的纹理时会出现噪音。但是,通过创建一个字形的 8x8 纹理,可以正确显示纹理。

像素缓冲区是 8 位单色的,所以我将 GL_ALPHA 作为缓冲区格式传递。我也尝试使用 32bpp GL_RGBA 格式,它产生了相同的结果。

DebugFont
LoadBakedFont(void)
{
    glEnable(GL_BLEND);
    glEnable(GL_TEXTURE_2D);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    unsigned char baked_font[128][8] = {} //In my source code this is not empty :)

    unsigned char *pixels = (unsigned char*)malloc(sizeof(unsigned char) * 128 * 8 * 8);
    memset(pixels, 0, sizeof(unsigned char) * 128 * 8 * 8);
    
    int counter = 0;
    for(int i = 0; i < 128; ++i)
    {
        for(int j = 0; j < 8; ++j)
        {
            for(int k = 0; k < 8; ++k)
            {
                unsigned char val = (baked_font[i][j] >> k & 1);
                pixels[counter++] = val == 1 ? 0xff : 0x00;
            }
        }
    }
    
    //Renders the exlamation mark perfectly
    for(int y = 0; y < 8; ++y)
    {
        for(int x = 0; x < 8; ++x)
        {
            unsigned char *test = pixels + (0x21 * 64);
            if(test[y * 8 + x])
                printf("@");
            else
                printf(".");
        }
        printf("\n");
    }

//POD struct
    DebugFont font;
    
    glGenTextures(1, &font.tex);
    glBindTexture(GL_TEXTURE_2D, font.tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 8 * 128, 8, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pixels);
    glBindTexture(GL_TEXTURE_2D, 0);                        
    
    free(pixels);
    return font;
}

void
DrawTexture(DebugFont font)
{
    glBindTexture(GL_TEXTURE_2D, font.tex);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f);   glVertex2f(0,0);
    glTexCoord2f(1.0f, 0.0f);   glVertex2f(8 * 128,0);
    glTexCoord2f(1.0f, 1.0f);   glVertex2f(8 * 128, 8);
    glTexCoord2f(0.0f, 1.0f);   glVertex2f(0, 8);
    glEnd();
    glBindTexture(GL_TEXTURE_2D, 0);
}

随机噪音?

感叹号

用户253751

排列数据的方式对于每个 8x8 组成一个字符的 8x1024 高图像是有意义的。

但是您将其加载为 1024x8 图像,将所有像素放在错误的位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章