2014-01-07 53 views
1

请不要告诉我使用24位纹理或类似的东西,因为这是我的宠物项目,它需要支持1,4,8,16和32位纹理格式。如何在opengl中加载灰度4位每像素纹理?

现在,所有上述格式的工作,甚至1bpp,除了4位之一。我还应该提到使用的颜色是16灰度。此外,我使用的纹理都填充到4个字节。

因此,例如,让说,我希望加载这个4×4纹理

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

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

我怎么加载这样的纹理?现在

,我tryed与

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

但由于某些原因,它产生相同的结果与使用使用GL_LUMINANCE一个8位的纹理,我只在屏幕上看到一个2x4的纹理图案,与其他一半黑色。

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

我希望我已经足够清楚,如果不是,只是告诉我,我会做出更正。

+1

您需要以某种方式解码,因此每个完整字节都是单个纹素 –

回答

2

GL_LUMINANCE4内部格式,即纹理数据将被存储在OpenGL端的格式。但是,您想要指定每像素4位的外部数据格式来解包像素。这由格式类型确定,参数为glTexImage格式在你的情况下是GL_LUMINANCE(在更高版本的OpenGL中,这将只是FYI的GL_RED)以及类型,很遗憾,必须告诉你,OpenGL中没有每像素4位可用的解包类型。尽管可能有供应商特定的扩展。

你最好的行动方式是自己解压成每像素8位格式然后上传。这不是很难实现。