通过 PyOpenGL 的 16 位纹理

问题描述 投票:0回答:1

我正在尝试使用以下语句在 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)
python opengl pyopengl
1个回答
0
投票

我猜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)
© www.soinside.com 2019 - 2024. All rights reserved.