OpenGL GL_R8生成0x501,GL_RGB8不生成



这似乎是一个相当简单的问题(或者至少尽可能接近)。当我通过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_RGB8GL_RGBA8)一直是OpenGL的核心功能,但1和2组件内部格式是一个非常新的功能,如GL_R8GL_RG8,需要相当新的硬件和相应的驱动程序(至少OpenGL 3,我认为,不再那么新了,但如果你说你的labtop已经过时了,那么可能太新了)。

有旧的(现在已弃用)1/2组件内部格式,如GL_LUMINANCEGL_LUMINANCE_ALPHAGL_INTENSITY(以及它们各自的大小版本),任何旧的实现都应该支持这些格式。但请注意,与较新的纯彩色格式相比,这些格式的语义和过滤/复制行为略有不同。但也许它们对于您的用例来说已经足够了。

还要注意,作为外部格式(用于读取/写入纹理数据的CPU像素数据的格式),格式GL_RED(可能还有GL_RG?)应该始终可用(具有相应的语义),但这与内部纹理数据完全无关。

GL_R8是一种非常新的格式(如果您认为后GL 2.1是"新的"格式的话)。

请改用GL_LUMINANCE8

相关内容

  • 没有找到相关文章