详细原因 here 我需要使用位图来纹理四边形(例如,每像素1位,而不是8位像素图)。
现在我有一个位图存储在设备上的缓冲区中,并按如下方式安装:
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, BFR.G[(T+1)%2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, W, H, 0, GL_COLOR_INDEX, GL_BITMAP, 0);
OpenGL规范有关于glTexImage2D的说法: “如果type为GL_BITMAP,则数据被视为无符号字节的字符串(格式必须为GL_COLOR_INDEX)。每个数据字节被视为8个1位元素......”
根据规范判断,缓冲区中的每个位应对应一个像素。 但是,以下实验表明,无论出于何种原因,它都不像宣传的那样有效:
1)当我构建纹理时,我以32位块的形式写入缓冲区。根据规范的措辞,可以合理地假设为每个值写入0x00000001将导致纹理具有1-px宽的垂直条,它们之间具有31个宽的空格。但是,它显得空白。
2)接下来,我用0x000000FF写。由于我对位图模式的明显缺陷的理解,我希望这应该产生8宽的条形,它们之间有24个宽的空间。相反,它产生一个白色的1-px宽的条。
3)0x55555555 = 1010101010101010101010101010101,因此写入此值应该创建1像素间距的1宽垂直条纹。但是,它会产生坚实的灰色。
4)在GL_BITMAP模式下使用原始的8位像素图可以生成正确的动画。
我已经得出结论,即使在GL_BITMAP模式下,纹理器仍然将8位解释为1个元素,尽管规范似乎暗示了这一点。事实上,我可以生成灰色(虽然我期待我正在使用双色调),以及我原来的8位像素图生成正确图片的事实,支持这个结论。
问题:
1)我是否缺少某种先决条件调用(可能用于设置步幅或包装对齐等),它会向纹理器发出信号,将每个字节视为8个元素,如规范中所示?
2)或者它根本不起作用,因为现代硬件不支持它? (我已经读过GL_BITMAP模式在3.3中被弃用了,但是我强迫3.0上下文。)
3)我最好使用着色器将位图解压缩到像素图中吗?这是一个比我希望的更为迂回的解决方案,但我想没有免费的午餐。