这似乎是一个相当简单的问题(或至少尽可能接近).当我传递GL_RGB8,GL_RGBA8或大多数任何多通道内部格式时,下面的行不会产生错误.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, fontImgSize, fontImgSize, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
Run Code Online (Sandbox Code Playgroud)
但是,当我传递GL_R8或任何8位单通道变量时,glGetError返回0x501(无效值).
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, fontImgSize, fontImgSize, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
Run Code Online (Sandbox Code Playgroud)
知道这里发生了什么吗?我目前使用的计算机是相当过时和低功耗的,但如果这是问题我怀疑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
?)应始终可用(具有相应的语义),但这与内部完全无关纹理数据.