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

8xiog9wr  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(92)

我尝试通过将烘焙字体的数据填充到像素缓冲区来制作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);
}

Random noise?
Exclamation Mark

hkmswyz6

hkmswyz61#

排列数据的方式对于8x1024高图像(每个8x8组成一个字符)是有意义的。
但是你把它作为1024x8的图像加载,把所有的像素都放错了地方。

相关问题