我正在尝试使用以下语句在 PyOpenGL 中创建 16 位纹理。
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,
Window 不支持 16 位纹理? (或者可能是显卡?)
加载如下所示的 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)
我猜GL_RGB内部以float32格式存储纹理
不,不是。只要未指定大小的内部格式,纹理内部每个通道就有 8 位。例如:
GL_RGBA16
。请参阅glTexImage2D
。
您收到无效操作错误,因为您的内部格式是整数(
GL_RGB16UI
),但指定的纹理类型是无符号标准化的(GL_UNSIGNED_SHORT
)
更改内部格式:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16, width, height, 0, GL_RGB, GL_UNSIGNED_SHORT, img_data)