PyOpenGL创建16位纹理触发GL_INVALID_OPERATION报错求助
问题描述
尝试通过以下PyOpenGL代码创建16位纹理时触发invalid operation错误:
img_data = cv2.imread("Texture.png",cv2.IMREAD_UNCHANGED) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16UI, width, height, 0, GL_RGB, GL_UNSIGNED_SHORT, img_data)
报错栈信息:
Traceback (most recent call last): File "C:\Users\gurubhat\PycharmProjects\OpenGL\TextureSample.py", line 106, in <module> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16UI, width, height, 0, GL_RGB, GL_UNSIGNED_SHORT, img_data) File "src\latebind.pyx", line 39, in OpenGL_accelerate.latebind.LateBind.__call__ File "src\wrapper.pyx", line 318, in OpenGL_accelerate.wrapper.Wrapper.__call__ File "src\wrapper.pyx", line 311, in OpenGL_accelerate.wrapper.Wrapper.__call__ File "C:\Users\gurubhat\PycharmProjects\VENV\venv\Lib\site-packages\OpenGL\platform\baseplatform.py", line 415, in __call__ return self( *args, **named ) ^^^^^^^^^^^^^^^^^^^^^^ File "src\errorchecker.pyx", line 58, in OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError OpenGL.error.GLError: GLError( err = 1282, description = b'invalid operation', baseOperation = glTexImage2D,
同时,加载8位图像的代码可正常运行,猜测GL_RGB内部以float32格式存储纹理:
img_data = cv2.imread("8bitimage.png",cv2.IMREAD_UNCHANGED) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, img_data)
疑问:
- 报错是因为Windows系统不支持16位纹理,还是显卡不支持?
- 关于
GL_RGB内部存储格式的猜测是否正确?
问题分析与解决
1. 报错核心原因:格式不匹配
报错并非Windows或显卡不支持16位纹理,而是纹理内部格式与像素数据格式不匹配:
GL_RGB16UI是无符号整数类型的纹理内部格式,这类整数纹理要求像素数据必须使用带INTEGER后缀的格式枚举传递,不能用普通的GL_RGB。
修正后的代码:
img_data = cv2.imread("Texture.png", cv2.IMREAD_UNCHANGED) # 像素格式改为GL_RGB_INTEGER,匹配GL_RGB16UI的整数类型 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16UI, width, height, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, img_data)
2. Windows与显卡的16位纹理支持情况
Windows系统本身完全支持16位纹理,只要显卡支持OpenGL 3.0及以上版本(现代显卡基本都满足),就支持GL_RGB16UI格式。若修正格式后仍报错,可通过以下代码直接查询格式支持性:
from OpenGL.GL import * support = GLint() glGetInternalformativ(GL_TEXTURE_2D, GL_RGB16UI, GL_INTERNALFORMAT_SUPPORTED, 1, support) print("GL_RGB16UI支持状态:", support.value)
3. 关于GL_RGB内部存储格式的说明
你的猜测错误:当使用GL_RGB作为内部格式时,OpenGL会根据显卡能力和上下文配置,自动选择最匹配的存储格式(通常是8位无符号整数GL_RGB8),而非float32。若需要float32格式的纹理,需显式指定内部格式为GL_RGB32F。
内容的提问来源于stack exchange,提问作者bsguru
相关产品推荐
相关产品推荐

