这似乎是一个相当简单的问题(或者至少尽可能接近)。当我通过GL_RGB8、GL_RGBA8或大多数多通道内部格式时,下面的行不会产生错误。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, fontImgSize, fontImgSize, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
但是,当我通过GL_R8或任何8位单通道变体时,glGetError返回0x501(无效值)。
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, fontImgSize, fontImgSize, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
知道这里发生了什么吗?我目前使用的计算机相当过时,而且功耗很低,但如果这是问题所在,我怀疑RGB8或RGBA8是否能工作。
对于那些好奇的人来说,fontImgSize==2048,这是我电脑上的最大纹理大小。
编辑:看起来GL_RG8和2通道/16位格式也会产生0x501
很长一段时间以来,3和4组件内部格式(如GL_RGB8
和GL_RGBA8
)一直是OpenGL的核心功能,但1和2组件内部格式是一个非常新的功能,如GL_R8
和GL_RG8
,需要相当新的硬件和相应的驱动程序(至少OpenGL 3,我认为,不再那么新了,但如果你说你的labtop已经过时了,那么可能太新了)。
有旧的(现在已弃用)1/2组件内部格式,如GL_LUMINANCE
、GL_LUMINANCE_ALPHA
和GL_INTENSITY
(以及它们各自的大小版本),任何旧的实现都应该支持这些格式。但请注意,与较新的纯彩色格式相比,这些格式的语义和过滤/复制行为略有不同。但也许它们对于您的用例来说已经足够了。
还要注意,作为外部格式(用于读取/写入纹理数据的CPU像素数据的格式),格式GL_RED
(可能还有GL_RG
?)应该始终可用(具有相应的语义),但这与内部纹理数据完全无关。
GL_R8
是一种非常新的格式(如果您认为后GL 2.1是"新的"格式的话)。
请改用GL_LUMINANCE8
。