中午写的博文中,认为glcolortable()函数发生错误是opengl版本问题或者是显卡问题,经过一下午的在查看资料发现,其主要原因是对opengl GL_ARB_imaging扩展模块的不支持。查看glew.h头文件你会发现glColorTable()函数定义在GL_ARB_imaging下面。我们如何查看计算机是否对GL_ARB_imaging支持那,请看下面代码:
static GLboolean CheckExtension(char *extName, const char *extString)
{
/*
** Search for extName in the extensions string. Use of strstr()
** is not sufficient because extension names can be prefixes of
** other extension names. Could use strtok() but the constant
** string returned by glGetString can be in read-only memory.
*/
char *p = (char *)extString;
char *end;
int extNameLen;
extNameLen = strlen(extName);
end = p + strlen(p);
while (p < end) {
int n = strcspn(p, " ");
if ((extNameLen == n) && (strncmp(extName, p, n) == 0)) {
return GL_TRUE;
}
p += (n + 1);
}
return GL_FALSE;
}
const GLubyte *ext_string;
int new_ext_supported = GL_FALSE;
if (CheckExtension("GL_ARB_imaging", glGetString(GL_EXTENSIONS)))
new_ext_supported = GL_TRUE;
以上代码来自:http://www.opengl.org/registry/doc/rules.html
glGetString(GL_EXTENSIONS)获取opengl扩展的支持字符串,CheckExtension()函数是对字符串的分析,第一个参数为扩展名称。
opengl的扩展名称以及之间的包含关系可以在glew.h中查看。
glColortable函数属于GL_ARB_imaging,
glGenVertexArrays属于GL_ARB_vertex_array_object扩展。
在使用glColortable之前应该检测一下计算机是否支持GL_ARB_imaging,以防止程序崩溃。
也可以通过如下面判断:
PFNGLCOLORTABLEPROC pGLColorTable = NULL;
pGLColorTable = (PFNGLCOLORTABLEPROC)wglGetProcAddress("glColorTable");
如果pGLColorTable为空,则不支持。
另一种方法:
// 检测图像子集
if(gltIsExtSupported("GL_ARB_imaging") == 0)
{
printf("Imaging subset not supported\r\n");
return 0;
}