我正在编写游戏引擎,但在加载纹理时我遇到了一个令人费解的问题。
我的代码如下:
//Load to GL
glGenTextures(1, &glTextureID);
glBindTexture(GL_TEXTURE_2D, glTextureID);
glTexImage2D(glTextureID, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
启用GL调试输出后单步执行显示glTexImage2D
行给出错误:
已生成错误。 GL错误GL_INVALID_ENUM in(null):( ID:1938861751)1无效。
格式取决于正在加载的图像,并使用FreeImage
确定。 (对于各个图像类型,分别为GL_RGBA
和GL_RED
。 width
/ height
也取决于FreeImage
,GL_RGBA
案例中的值均为512。据我了解,这些值对两种格式参数都有效。
使用FreeImage
的完整代码包含在这里有点冗长,并且使用多个线程(我确信这个代码在主线程上运行,并且我在这些行之前断言)。
以下也不起作用:
glTexImage2D(glTextureID, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
我无法找到任何其他有此错误的人。我已经研究了如何抛出GL_INVALID_ENUM
,但是没有一种记录的方法似乎适用,当然也没有我收到的消息。
glTextureID
的值未在这些行之间修改,保留在' 1'。
尝试加载其他纹理时,同样的错误也被抛出,其中' target'与众不同。
我的GL上下文已正确初始化,因为我能够使用其他GL函数,并成功绘制无纹理多边形。
导致这种情况的原因是什么?
答案 0 :(得分:11)
glTexImage2D
的第一个参数是target
,必须是GL_TEXTURE_2D
,GL_PROXY_TEXTURE_2D
,GL_TEXTURE_1D_ARRAY
......
将您的代码更改为:
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
注意glTexImage2D
指定绑定到当前Texture unit的纹理对象的二维纹理。
见OpenGL 4.6 core profile specification - 8.5. TEXTURE IMAGE SPECIFICATION, page 212:
命令
void TexImage2D( enum target, int level, int internalformat, sizei width, sizei height, int border, enum format, enum type, const void *data );
用于指定二维纹理图像。对于二维纹理,target必须是
TEXTURE_2D
之一,对于一维数组纹理,TEXTURE_1D_ARRAY
,对于矩形纹理,TEXTURE_RECTANGLE
,或者来自表的一个立方体贴图面对象,