【问题标题】:How do you load grayscale 4-bit per pixel texture in opengl?你如何在opengl中加载每像素4位的灰度纹理?
【发布时间】:2014-01-08 08:47:23
【问题描述】:

请不要告诉我使用 24 位纹理之类的东西,因为这是我的一个宠物项目,它需要支持 1、4、8、16 和 32 位纹理格式。

现在,上述所有格式都可以使用,即使是 1bpp,除了 4bit 格式。我还应该提到,使用的颜色是 16 种灰色。此外,我使用的纹理都填充到 4 个字节。

例如,假设我想加载这个 4x4 纹理

BYTE Img[4][4] = {
    {0xCD, 0xEF, 0x00, 0x00},
    {0x89, 0xAB, 0x00, 0x00},
    {0x45, 0x67, 0x00, 0x00},
    {0x01, 0x23, 0x00, 0x00},
};

每个半字节应该代表一个纹素。 0x00 用于填充目的。

我到底如何加载这样的纹理???

现在,我尝试了

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE4, 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pTex);

但由于某种原因,它与使用 GL_LUMINANCE 的 8 位纹理得到的结果相同,我只在屏幕上看到 2x4 纹理图案,另一半是黑色的。

我也尝试过使用 glPixelMapfv,但我无法让它工作,我得到的只是一个空白纹理。

我希望我已经足够清楚了,如果没有,请告诉我,我会进行更正。

【问题讨论】:

  • 您可能需要以某种方式解码,以便每个完整字节都是一个单独的纹素

标签: opengl textures grayscale


【解决方案1】:

GL_LUMINANCE4internal 格式,即纹理数据将存储在 OpenGL 端的格式。但是,您需要指定每像素 4 位的外部数据格式来解压缩像素。这由glTexImageformattype 参数决定。在你的情况下,格式GL_LUMINANCE(在更高版本的OpenGL中,这将是GL_RED,仅供参考)和类型,很抱歉不得不告诉你你,在 OpenGL 中没有可用的每像素 4 位解包类型。不过可能会有特定于供应商的扩展。

您最好的做法是自己解压缩成每像素 8 位的格式,然后上传。这不是很难实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多