16-位纹理通过PyOpenGL

f87krz0w  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(160)

我尝试使用下面的语句在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,


16-位纹理在Windows?上不受支持(或者可能是图形卡?)
像下面这样加载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)

n3schb8v

n3schb8v1#

你得到一个无效的操作错误,因为你的内部格式是整数(GL_RGB16UI),但指定的纹理格式不是(GL_RGB)。请参阅glTexImage2D和OpenGL 4.6 API规范
如果内部格式为整数且format不是表8.8中列出的整数格式之一,或者内部格式不是整数且format是整数格式,则会生成INVALID_OPERATION错误。
将 * 内部格式 * 更改为浮点格式(GL_RGB16/GL_RGB

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16, width, height, 0, GL_RGB, GL_UNSIGNED_SHORT, img_data)

字符串
或将 format 转换为整数格式(GL_RGB16UI/GL_RGB_INTEGER

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16UI, width, height, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, img_data)


在着色器中,sampler2D类型的采样器必须用于浮点纹理,usampler2D类型的采样器必须用于无符号整数纹理。另请参见Sampler (GLSL)
我猜GL_RGB在内部以float 32格式存储纹理
不,它不是。纹理通常在内部每个通道有8位,只要没有指定大小的内部格式。例如:GL_RGBA16。参见glTexImage2D

相关问题