glTextureView调用触发GL_INVALID_OPERATION错误求助
兄弟,碰到glTextureView报GL_INVALID_OPERATION的情况我之前也踩过不少坑,结合你用GL_TEXTURE_2D_ARRAY存储纹理的场景,我给你列几个最可能的原因和排查方向,你可以逐一核对:
原纹理参数不兼容:
glTextureView对原纹理的格式、存储类型有严格要求。如果原GL_TEXTURE_2D_ARRAY是用glTexStorage3D创建的不可变存储纹理,那么视图的格式必须和原纹理完全一致;如果是用glTexImage3D创建的可变存储,也要保证视图格式和原纹理的内部格式兼容。另外,原纹理不能设置一些冲突的参数,比如某些压缩格式可能不支持纹理视图功能。视图目标类型不匹配:从
GL_TEXTURE_2D_ARRAY创建单个纹理视图时,目标必须是GL_TEXTURE_2D。要是你不小心写成了GL_TEXTURE_3D或者其他不匹配的目标类型,必然会触发这个错误。层/层级范围越界:创建视图时指定的
minLayer、numLayers(或者minLevel、numLevels)超出了原纹理的实际范围。比如你原数组有_layers层,结果minLayer + numLayers大于_layers,或者指定的mip层级超过了原纹理生成的层级数,都会报错。原纹理未正确初始化:先确认你的
GL_TEXTURE_2D_ARRAY纹理本身创建成功了吗?可以在创建原纹理后立刻调用glGetError()检查,说不定原纹理创建时就已经有错误(比如格式不支持、尺寸非法),导致后续视图创建失败。环境支持问题:
glTextureView是OpenGL 4.3才原生支持的接口,或者需要ARB_texture_view扩展。如果你的运行环境不满足这个版本或扩展要求,也可能触发错误(不过这种情况更多会先报GL_INVALID_ENUM,但也不能完全排除),可以先确认下你的OpenGL版本是否达标。
另外,你贴的代码只到构造函数开头,建议把创建纹理数组的完整代码(比如glTexStorage3D或glTexImage3D的调用)以及glTextureView的具体调用代码都补上,这样能更精准定位问题。举个正确创建单层层视图的例子供你参考:
// 假设originalArrayTex是已创建好的GL_TEXTURE_2D_ARRAY纹理ID GLuint singleTextureView; glGenTextures(1, &singleTextureView); // 创建第3层(索引从0开始)的2D纹理视图,使用原纹理的第0级mip glTextureView( singleTextureView, GL_TEXTURE_2D, originalArrayTex, GL_RGBA8, // 必须和原纹理内部格式一致 0, 1, // minLevel=0,numLevels=1 2, 1 // minLayer=2,numLayers=1 );
备注:内容来源于stack exchange,提问作者AstralHex

