OpenGL 错误获取glGetError()

转载:http://blog.youkuaiyun.com/u010270148/article/details/52934295
如果函数参数不符或者不符合当前上下文设置的状态,则会导致 OpenGL Error。已 error code 来表示。绝大多数情况下 OpenGL functions 产生 errors,则不会生效。少数有效。


OpenGL Error 存储在一个队列中,直到该错误被处理。因此,如果你不定期的检测错误,你将不会知道某个函数某个函数的调用触发了错误。因此,错误检测应该定期检测,确保知道错误的详细信息。


获取队列中下一个 OpenGL Error,并从队列中移除。如果返回 GL_NO_ERROR 则该队列为空。
GLenum glGetError()​
若获取所有的 OpenGL Error 
for(GLenum err; (err = glGetError()) != GL_NO_ERROR;)
{
 //Process/log the error.
}

所有的返回值有:
GL_NO_ERROR  :(0)当前无错误值
GL_INVALID_ENUM  :(1280)仅当使用非法枚举参数时,如果使用该参数有指定环境,则返回 GL_INVALID_OPERATION 
GL_INVALID_VALUE  :(1281)仅当使用非法值参数时,如果使用该参数有指定环境,则返回 GL_INVALID_OPERATION 
GL_INVALID_OPERATION  :(1282)命令的状态集合对于指定的参数非法。
GL_STACK_OVERFLOW  :(1283)压栈操作超出堆栈大小。
GL_STACK_UNDERFLOW  :(1284)出栈操作达到堆栈底部。
GL_OUT_OF_MEMORY  :(1285)不能分配足够内存时。
GL_INVALID_FRAMEBUFFER_OPERATION  :(1286)当操作未准备好的真缓存时。
GL_CONTEXT_LOST  :(1287)由于显卡重置导致 OpenGL context 丢失。
<think>嗯,用户想通过OpenGL API获取显卡的基本信息和运行时状态数据。首先,我需要回忆一下OpenGL中相关的函数和扩展。记得获取基本信息通常用glGetString函数,参数比如GL_VENDOR、GL_RENDERER、GL_VERSION这些可以拿到厂商、渲染器名称和版本号。对了,还有GL_SHADING_LANGUAGE_VERSION可以获取着色语言版本。 然后是硬件限制信息,比如最大纹理尺寸、各向异性过滤等级,这些可能要用glGetIntegerv,比如GL_MAX_TEXTURE_SIZE、GL_MAX_VIEWPORT_DIMS之类的枚举值。不过要注意不同版本的OpenGL支持不同的特性,可能需要检查扩展是否存在,比如GL_EXT_texture_filter_anisotropic。 运行时状态的话,比如当前帧的FPS,这个需要自己计算,记录每帧的时间间隔。另外显存使用情况,可能需要用到像GL_NVX_gpu_memory_info这样的扩展,但这个是厂商特定的,可能不是所有显卡都支持。还有温度、风扇转速这些硬件数据,OpenGL本身不提供,可能需要系统层面的API,比如WMI或者NVML。 哦,对了,还有错误检查,glGetError可以获取最近的错误代码。性能计数器方面,GL_TIMESTAMP或者GL_EXT_disjoint_timer_query扩展可以用来测量渲染时间。 应该分步骤说明,先讲基本信息获取,再讲硬件限制,然后是运行时状态,最后提一下扩展和注意事项。代码示例的话,用C语言展示glGetString和glGetIntegerv的用法,还有FPS计算的伪代码。 需要提醒用户注意不同驱动和扩展的支持情况,可能存在的平台差异。还有显存和温度这类数据可能需要特定厂商的扩展,或者系统级别的工具。</think>### OpenGL获取显卡信息与运行状态方法 在OpenGL获取显卡信息和运行时状态主要通过以下核心API实现: 一、获取基本信息 1. 硬件厂商信息 ```c const GLubyte* vendor = glGetString(GL_VENDOR); // 显卡厂商 const GLubyte* renderer = glGetString(GL_RENDERER); // 显卡型号 const GLubyte* version = glGetString(GL_VERSION); // OpenGL版本 const GLubyte* glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION); // GLSL版本[^2] ``` 2. 硬件能力参数 ```c GLint maxTextureSize; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); // 最大纹理尺寸 GLint maxAnisotropy; glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy); // 各向异性过滤等级[^3] ``` 二、运行时状态监测 1. 帧率计算(需自行实现计时逻辑) ```python prev_time = time.time() frame_count = 0 def update_fps(): global prev_time, frame_count current_time = time.time() frame_count += 1 if current_time - prev_time >= 1.0: fps = frame_count / (current_time - prev_time) print(f"FPS: {fps:.1f}") frame_count = 0 prev_time = current_time ``` 2. 显存监测(需要扩展支持) ```c // 需要GL_NVX_gpu_memory_info扩展 GLint total_mem_kb, used_mem_kb; glGetIntegerv(GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX, &total_mem_kb); glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &used_mem_kb); ``` 三、扩展检测方法 ```c // 检测扩展支持情况 if (glewIsSupported("GL_EXT_texture_filter_anisotropic")) { // 支持各向异性过滤 } ``` 四、错误状态查询 ```c GLenum err = glGetError(); // 返回最近一次错误代码 ``` 注意事项: 1. 部分功能需要特定扩展支持(如GL_NVX_gpu_memory_info) 2. 温度/风扇转速等硬件数据需通过厂商SDK(如NVIDIA NVML)获取[^4] 3. 现代OpenGL建议使用glfwGetPhysicalDeviceProperties等Vulkan式查询(需GL 4.6+)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值