如何在opengl中加载每像素纹理4位灰度?

时间:2014-01-07 07:13:13

标签: opengl textures grayscale

请不要告诉我使用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,但我不能让它工作,我得到的只是一个空白的纹理。

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

1 个答案:

答案 0 :(得分:2)

GL_LUMINANCE4内部格式,即纹理数据将存储在OpenGL端的格式。但是你想要的是指定一个4位/像素的外部数据格式来解包像素。这由glTexImage格式类型参数决定。您的案例中的格式GL_LUMINANCE(在OpenGL的更高版本中,这将是GL_RED只是FYI)和类型,对不起必须告诉你,OpenGL中没有每像素解包类型4位。可能会有特定于供应商的扩展。

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