如何在PyOpenGL中通过textureID获取纹理尺寸?
获取PyOpenGL中已加载纹理的尺寸
在PyOpenGL中,glGetTextureLevelParameteriv无法直接使用Python普通列表接收返回值,你需要用ctypes类型变量来传递可写入的内存地址给OpenGL API。以下是可行的实现方式:
1. 依赖准备
先导入必要的模块:
import ctypes from OpenGL.GL import *
2. 查询纹理宽高的代码
假设你已经有了加载完成的texture_id,直接通过纹理ID查询即可(无需绑定纹理,这是OpenGL 4.5+的直接纹理操作特性):
# 查询宽度 width = ctypes.c_int() glGetTextureLevelParameteriv(texture_id, 0, GL_TEXTURE_WIDTH, ctypes.byref(width)) # 查询高度 height = ctypes.c_int() glGetTextureLevelParameteriv(texture_id, 0, GL_TEXTURE_HEIGHT, ctypes.byref(height)) # 提取实际数值 tex_width = width.value tex_height = height.value
为什么列表不行?
Python列表是高层数据结构,并不对应C语言的指针/连续内存块。OpenGL的C风格API需要一块可直接写入的内存地址,ctypes.byref()能正确提供这个地址,让API直接修改变量内部的值,而普通列表做不到这一点。
兼容旧版OpenGL的方案
如果你的PyOpenGL版本不支持glGetTextureLevelParameteriv,可以用旧版的绑定后查询方式:
glBindTexture(GL_TEXTURE_2D, texture_id) width = ctypes.c_int() glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, ctypes.byref(width)) height = ctypes.c_int() glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, ctypes.byref(height)) tex_width = width.value tex_height = height.value
内容的提问来源于stack exchange,提问作者AndreaTerenz
相关产品推荐
相关产品推荐

