请不要告诉我使用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,但我不能让它工作,我得到的只是一个空白的纹理。
我希望我已经足够清楚了,如果没有,请告诉我,我会做出更正。
答案 0 :(得分:2)
GL_LUMINANCE4
是内部格式,即纹理数据将存储在OpenGL端的格式。但是你想要的是指定一个4位/像素的外部数据格式来解包像素。这由glTexImage
的格式和类型参数决定。您的案例中的格式是GL_LUMINANCE
(在OpenGL的更高版本中,这将是GL_RED
只是FYI)和类型,对不起必须告诉你,OpenGL中没有每像素解包类型4位。可能会有特定于供应商的扩展。
您最好的做法是自己解压缩为每像素8位格式,然后上传。这不是很难实现。