如何使用 GLADcallback



我正在使用 glad 来生成 OpenGL 绑定,并生成了一个调试版本,其中包括以下内容:

// this symbol only exists if generated with the c-debug generator
#define GLAD_DEBUG
typedef void (* GLADcallback)(const char *name, void *funcptr, int len_args, ...);
/*
 * Sets a callback which will be called before every function call
 * to a function loaded by glad.
 *
 */
GLAPI void glad_set_pre_callback(GLADcallback cb);
/*
 * Sets a callback which will be called after every function call
 * to a function loaded by glad.
 *
 */
GLAPI void glad_set_post_callback(GLADcallback cb);

文档给出了一个如何定义此回调的示例,如下所示:

void _post_call_callback_default(const char *name, void *funcptr, int len_args, ...) {
    GLenum error_code;
    error_code = glad_glGetError();
    if (error_code != GL_NO_ERROR) {
        fprintf(stderr, "ERROR %d in %sn", error_code, name);
    }
}

我不明白的是我应该如何访问 varargs。我猜它们是传递给 OpenGL 函数的值,因此可以是任何类型的。但是,我必须指定要va_arg的类型才能访问值。

我觉得参数 len_args 暗示有某种方法可以迭代 varargs,但我不明白在不知道类型的情况下应该如何使用它。如何使用它们?

每当调用 glad_set_post_callback 函数时,您都有 glad.c 的源代码。在那里你可以看到参数取决于调用的函数。所以我认为你需要检查名称/funcptr 参数。例如,如果调用了 glEnable,那么您有:

void APIENTRY glad_debug_impl_glEnable(GLenum arg0) {    
    _pre_call_callback("glEnable", (void*)glEnable, 1, arg0);
     glad_glEnable(arg0);
    _post_call_callback("glEnable", (void*)glEnable, 1, arg0);
}

这意味着第一个参数是 GLenum。请参阅此问题 a example-of-use-of-varargs-in-c 关于如何使用变量参数:

它会是这样的(未经测试):

void _post_call_callback_default(const char *name, void *funcptr, int len_args, ...) {
    GLenum error_code;
    error_code = glad_glGetError();
    if (error_code != GL_NO_ERROR && funcptr == (void*)glEnable /* or strcmp(name,"glError") == 0*/) {
        va_list ap;
        va_start(ap, len_args);
        GLenum arg0 = va_arg(ap, GLenum);
        va_end(ap);
        printf("Called glError(%d) with Error %dn", arg0, error_code);
    }
}

您可以决定要为哪些函数提供更好的调试日志。我不知道是否已经有一些免费代码可以提供更好的调试输出。

也许最好将 funcptr 与指向 glEnable 的指针进行比较,而不是将字符串名称与"glError"进行比较。我没有测试过。上面的代码只是一个示例,我会以不同的方式编写它。

相关内容

  • 没有找到相关文章

最新更新