(定义一个宏)方便OpenGL命令调试?

2024-04-28

有时插入条件打印和检查需要很长时间glGetError()使用二分搜索的形式来缩小范围,其中第一个函数调用是 OpenGL 首先报告错误。

我认为如果有一种方法可以构建一个宏,我可以包装所有可能失败的 GL 调用,并有条件地调用,那就太酷了glGetError之后立马。当针对特殊目标进行编译时,我可以对其进行检查glGetError具有非常高的粒度,在编译典型的发布或调试时,这不会被启用(我只会每帧检查一次)。

这样做有意义吗?搜索了一下,我发现一些人建议打电话glGetError在每次非绘制 gl 调用之后,这基本上与我所描述的相同。

那么在这种情况下,我可以做一些聪明的事情(上下文:我正在使用 GLEW)来简化以这种方式检测我的 gl 调用的过程吗?此时将我的代码转换为将宏包装在每个 OpenGL 函数调用周围将是一项大量的工作。如果我能做一些聪明的事情并让所有这一切顺利进行而无需手动确定要检测的代码部分(尽管这也有潜在的优势......但事实并非如此),那就太好了。really当我调试错误源时不关心性能)。


尝试这个:

void CheckOpenGLError(const char* stmt, const char* fname, int line)
{
    GLenum err = glGetError();
    if (err != GL_NO_ERROR)
    {
        printf("OpenGL error %08x, at %s:%i - for %s\n", err, fname, line, stmt);
        abort();
    }
}

#ifdef _DEBUG
    #define GL_CHECK(stmt) do { \
            stmt; \
            CheckOpenGLError(#stmt, __FILE__, __LINE__); \
        } while (0)
#else
    #define GL_CHECK(stmt) stmt
#endif

像这样使用它:

GL_CHECK( glBindTexture2D(GL_TEXTURE_2D, id) );

如果 OpenGL 函数返回变量,请记住在 GL_CHECK 之外声明它:

const char* vendor;
GL_CHECK( vendor = glGetString(GL_VENDOR) );

这样,您将进行调试检查是否定义了 _DEBUG 预处理器符号,但在“Release”构建中,您将只有原始 OpenGL 调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(定义一个宏)方便OpenGL命令调试? 的相关文章

随机推荐

  • TreeSet 给出不正确的输出 - Java8

    在处理树集时 我发现了非常奇怪的行为 根据我的理解 以下程序应该打印两行相同的行 public class TestSet static void test String args Set
  • 如何调试 iOS 应用程序在启动时崩溃,仅在程序集文件中设置断点

    我遇到了当前正在开发的应用程序的问题 问题是应用程序在启动时在后台运行一段时间后崩溃 并且仅在这种情况下 在应用程序被杀死时启动应用程序不会导致调试器或手机崩溃 无论是否进行调试 在后台启动应用程序大约 5 10 分钟都不会导致崩溃 在后台
  • 以编程方式设置 Swift 元素的位置

    我在故事板中定义了一个标签 我正在尝试以编程方式更改其位置 SO 上已有一些问题似乎可以解决此问题 但似乎没有一个解决方案有效 即标签不移动 我已经删除了标签上所有现有的限制 但无济于事 我试过了 class LandingViewCont
  • 使用 Prism 在 Xamarin Forms 的后台服务中实现依赖注入

    我在我的 xamarin 表单项目中使用 Prism 我能够在我的视图模型中使用依赖注入 构造函数注入 没有任何问题 我还利用后台服务在后台推送长时间运行的任务 如何做我在后台服务中注入依赖项 当我尝试将接口对象作为参数传递给构造函数 Sy
  • CSV 实际上是....分号分隔值...(在 AZERTY 上导出 Excel)

    我在这里有点困惑 当我使用 Excel 2003 将工作表导出为 CSV 时 它实际上使用分号 Col1 Col2 Col3 shfdh dfhdsfhd fdhsdfh dgsgsd hdfhd hdsfhdfsh 现在 当我使用 Mic
  • 比 O(n) 更好的范围交集算法?

    范围交集是一个简单但不平凡的问题 已经回答过两次了 查找数字范围交集 https stackoverflow com questions 224878 find number range intersection 比较日期范围 https
  • 如何正确离开临界区?

    我有以下 C 代码 我在其中使用临界区对象 https msdn microsoft com en us library windows desktop ms682530 v vs 85 aspx EnterCriticalSection
  • mapFragment.getMapAsync 处的 NullPointerException

    在解决了与我的标题相关的问题后 我找不到问题的解决方案 我有一个NullPointerException at mapFragment getMapAsync 下面是我的MapActivity code package com exampl
  • 如何覆盖magento中的管理模板文件?

    我需要覆盖 adminhtml sales order create items grid phtml 文件 以在从管理员创建新订单时在每个项目下显示一些自定义文本 我希望通过自定义模块来完成此操作 任何人都可以建议如何覆盖管理模板文件 非
  • JUnit 测试 Spymemcached 客户端

    我有一个类围绕spymemcached 客户端 我想编写一些JUnit 测试来测试getValue 和addKey 方法是否有效 问题是无法从测试服务器访问spymemcached 服务器 所以我想这里需要一些模拟 我的简化类看起来像这样
  • 如何在 Apache POI 中获取 Excel 空白单元格值?

    我有一个巨大的 Excel 文件 其中包含大量列 如下所示 Column1 Column2 Column3 Column4 Column5 abc def ghi mno pqr 这是我编写的用于打印这些值的代码 try FileInput
  • 使用 ODBC 从理货中提取日账簿/交易数据

    我能够使用 Microsoft SQL 查询成功将 Excel 连接到 Tally ODBC 服务器 我现在想将整个历史记录的所有交易数据提取到 Excel 中 包括借方和贷方分类帐 就像在日记本中一样 但是 如果我使用提取CompanyV
  • 输出参数有什么问题?

    在 SQL 和 C 中 我从来都不太喜欢输出参数 我也从未在 VB6 中通过 ByRef 传递参数 依靠副作用来完成某件事只会让我烦恼 我知道它们是一种解决无法从函数返回多个结果的方法 但 SQL 中的行集或 C 和 VB 中的复杂数据类型
  • Woocommerce 根据购物车中的商品总数累进额外费用

    我正在寻找一些代码 可以根据购物车中的商品总数收取额外费用 例如 如果购物车中的商品数量 gt 6 gt 额外费用 5 如果购物车中的商品数量 gt 12 gt 额外费用 10 我努力了这段代码 https stackoverflow co
  • 免费 JqGrid - 网格不刷新

    我有一个组合框 当选择更改时 关联的网格将重新填充新数据 div class container fluid div class row div class col md 4 div div div
  • F# 中使用抽象类还是接口?

    从 C 背景开始摸索 F 在 C 中 决定何时使用接口和何时使用抽象类有明显的区别 在 F 中 我发现两者几乎合而为一 我知道 就 CLR 而言 F 中的做法与 C 中的做法相同 但是在 F 中编程时使用的 最佳实践 是什么 我应该完全避免
  • 使用 CSS 实现等高元素

    我读到了几种不同的解决方案来模拟等高的列或元素 但没有一个真正引起我的注意 因为它们使用了 hack 极其复杂的 HTML 布局或未得到广泛支持的属性 这是例子Fiddle http jsfiddle net weppos satgw 我的
  • Smarty -“无法写入文件... templates_c”。 (smarty_internal_write_file.php:44)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是第一次使用 Smarty 它在我的笔记本电脑 MAMP 上运行良好 但是当我尝试在生产服务器 Windows 上运行基本模板时 我收到
  • 以编程方式设置 mosquitto 中的访问控制限制

    我正在开发一个将使用 mqtt 的应用程序 我将使用 python 库 我一直倾向于使用 mosquitto 但找不到以编程方式为其设置访问控制限制的方法 我正在编写的应用程序需要能够区分用户 并且只允许他们订阅某些主题 当前的解决方案看起
  • (定义一个宏)方便OpenGL命令调试?

    有时插入条件打印和检查需要很长时间glGetError 使用二分搜索的形式来缩小范围 其中第一个函数调用是 OpenGL 首先报告错误 我认为如果有一种方法可以构建一个宏 我可以包装所有可能失败的 GL 调用 并有条件地调用 那就太酷了gl