我尝试使用下面的语句在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)
型
1条答案
按热度按时间n3schb8v1#
你得到一个无效的操作错误,因为你的内部格式是整数(
GL_RGB16UI
),但指定的纹理格式不是(GL_RGB
)。请参阅glTexImage2D
和OpenGL 4.6 API规范如果内部格式为整数且format不是表8.8中列出的整数格式之一,或者内部格式不是整数且format是整数格式,则会生成INVALID_OPERATION错误。
将 * 内部格式 * 更改为浮点格式(
GL_RGB16
/GL_RGB
)字符串
或将 format 转换为整数格式(
GL_RGB16UI
/GL_RGB_INTEGER
)型
在着色器中,
sampler2D
类型的采样器必须用于浮点纹理,usampler2D
类型的采样器必须用于无符号整数纹理。另请参见Sampler (GLSL)。我猜GL_RGB在内部以float 32格式存储纹理
不,它不是。纹理通常在内部每个通道有8位,只要没有指定大小的内部格式。例如:
GL_RGBA16
。参见glTexImage2D
。