我如何找出传递给 glGetObjectLabel 的 GLuint id 的类型?

How do I find out the type of the GLuint id passed to glGetObjectLabel?

OpenGL 通过带有声明的回调发送所有调试消息:

void MessageCallback(GLenum eSource, GLenum eType, 
                     GLuint eId, GLenum eSeverity, 
                     GLsizei sLength, const GLchar* strMessage, 
                     const void* userParam)

GLuint eId 类似于导致消息的对象。如果为对象分配了标签,则可以使用 glGetObjectLabel 读取字符串。但是函数定义

void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, char * label);

声明我必须将对象的 identifier (GLenum) 传递给该函数。我从哪里得到对象类型?是否有另一个函数可以从回调的 GLuint eId 中检索它?

我认为这对 OpenGL 生成的消息根本不起作用。

根据 Khronos 网站和 OpenGl SuperBible 的网页,MessageCallback eID 是一个消息标识符。它保证是一个实际的OpenGL对象。可以是递增的序列号。

即使 eID 是 texture/buffer/whatever 标识符,据我所知,您也无法确定它是什么类型。 OpenGL id 只是整数,至少在我的系统上它们在所有 OpenGL 中都不是唯一的。我可以生成一个顶点数组对象、一个顶点缓冲区对象和一个纹理,它们都具有相同的整数 id 值。有函数glIsBuffer、glIsTexture等;但它们可能都 return 对于单个 ID 为真。

您可以通过将对象标识符作为 eID 传递并将对象类型作为消息中的固定位置传递,使其适用于您自己的 glDebugMessageInsert 调用。