glTexImage2D'目标无效'

时间:2018-01-10 21:50:21

标签: c++ opengl graphics 3d

我正在编写游戏引擎,但在加载纹理时我遇到了一个令人费解的问题。

我的代码如下:

//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_RGBAGL_REDwidth / height也取决于FreeImageGL_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函数,并成功绘制无纹理多边形。

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:11)

glTexImage2D的第一个参数是target,必须是GL_TEXTURE_2DGL_PROXY_TEXTURE_2DGL_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,或者来自表的一个立方体贴图面对象,