C++ 如何找到传递给glGetObjectLabel的GLuint id的类型?

C++ 如何找到传递给glGetObjectLabel的GLuint id的类型?,c++,opengl,callback,C++,Opengl,Callback,OpenGL通过回调发送所有调试消息,并声明: void MessageCallback(GLenum eSource, GLenum eType, GLuint eId, GLenum eSeverity, GLsizei sLength, const GLchar* strMessage, const void* userParam) GLuinteId类似于

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);

声明我必须将对象的
标识符
(GLenum)传递给该函数。从何处获取对象类型?有没有其他函数可以从回调的GLuint
eId
中检索它?

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

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

即使eID是一个纹理/缓冲区/任何标识符,您也无法找到它的类型。OpenGL ID只是整数,至少在我的系统上,它们在所有OpenGL中都不是唯一的。我可以生成一个顶点数组对象、一个顶点缓冲区对象和一个纹理,所有这些都具有相同的整数id值。有缓冲、纹理等功能;但对于单个id,它们可能都返回true


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

我只看到两种可能的方法:a)使用每个可枚举对象类型调用
glGetObjectLabel
,并发布非空消息。->在资源/性能方面(调试时)的一个坏主意。。。B) 滥用回调的
void*userparam
参数。我必须将与对象相关的调用(纹理、程序等)包装在每个对象类型的一个类中,强制该类调用
glDebugMessageCallback
,并将对象类型作为用户参数传递。这两种方法都很复杂,只有作为一种思维实验才有意义。我必须承认回调不能自动检索带标签的globobjects