这似乎是一个相当简单的问题(或至少尽可能接近)。当我传递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
答案 0 :(得分:5)
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
?)应始终可用(带有相应的语义),但这与内部纹理数据完全无关。
答案 1 :(得分:1)
GL_R8
是一个非常新的(好吧,如果你认为后GL 2.1是“新的”)格式。
请尝试GL_LUMINANCE8
。