glTexImage2D'目标无效'

Jac*_*311 1 c++ opengl 3d graphics

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

我的代码如下:

//Load to GL
glGenTextures(1, &glTextureID);
glBindTexture(GL_TEXTURE_2D, glTextureID);
glTexImage2D(glTextureID, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
Run Code Online (Sandbox Code Playgroud)

在启用GL调试输出的情况下单步执行会显示该glTexImage2D行给出错误:

错误已生成.GL错误GL_INVALID_ENUM in(null):( ID:1938861751)1无效.

格式取决于正在加载的图像,并使用FreeImage.(与两种图像类型GL_RGBAGL_RED各图像类型分开).width/ height也确定为FreeImage,在这种GL_RGBA情况下两个值均为512 .我的理解是这些值对两种格式参数都有效.

使用的完整代码FreeImage有点冗长,包含在这里,并使用多个线程(我确信这个代码在主线程上运行,我在这些行之前断言).

以下也不起作用:

glTexImage2D(glTextureID, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
Run Code Online (Sandbox Code Playgroud)

我找不到任何其他有此错误的人.我已经研究了如何GL_INVALID_ENUM抛出,但是没有任何记录的方法似乎适用,当然也没有我收到的消息.

glTextureID这些行之间的值不会被修改,保持为"1".

尝试加载其他纹理时,也会抛出相同的错误,"目标"不同.

我的GL上下文被正确初始化,因为我能够使用其他GL函数,并成功绘制无纹理多边形.

可能是什么导致了这个?

Rab*_*d76 11

拳头参数glTexImage2Dtarget,它必须是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);
Run Code Online (Sandbox Code Playgroud)

注意glTexImage2D指定绑定到当前纹理单元的纹理对象的二维纹理.


请参阅OpenGL 4.6核心配置文件规范 - 8.5.纹理图像规格,第212页:

命令

void TexImage2D( enum target, int level, int internalformat, sizei width, sizei height, int border, enum format, enum type, const void *data );
Run Code Online (Sandbox Code Playgroud)

用于指定二维纹理图像.target必须是TEXTURE_2D二维纹理,TEXTURE_1D_ARRAY一维数组纹理,TEXTURE_RECTANGLE矩形纹理或表格中的一个立方体贴图面目标之一...