为什么从glGetString(GL_EXTENSIONS)搜索不能正常工作?

Why wouldn't a search from glGetString(GL_EXTENSIONS) work correctly?

本文关键字:常工作 工作 不能 搜索 GL EXTENSIONS 为什么 glGetString      更新时间:2023-10-16

我读过这一页:http://www.opengl.org/wiki/GlGetString

例如,如果扩展GL_EXT_pixel_transform_color_table为列出,进行简单搜索GL_EXT_pixel_transform将返回正,无论是否定义。

既然空间分离了,那怎么可能呢?你为什么不在你要搜索的关键词后面加一个空格呢?

例如:

char *exts = (char *)glGetString(GL_EXTENSIONS);
if(!strstr(exts, "GL_EXT_pixel_transform ")){ // notice the space!
    // not supported
}

我想知道为什么这不起作用,因为对我来说它确实起作用。

您可以使用空格作为分隔符来标记返回的字符串,以便进行更可靠的搜索(如果您不想使用较新的API)。例如,使用Boost.Tokenizer:

typedef boost::tokenizer< boost::char_separator<char> > tokenizer;
boost::char_separator<char> sep(" ");
tokenizer tok(static_cast<const char*>(glGetString(GL_EXTENSIONS)), sep);
if (std::find(tok.begin(), tok.end(), "GL_EXT_pixel_transform") != tok.end()) {
    // extension found
}

如果您要查找的扩展列在最后,该怎么办?那么它后面就不会有空白了。

我知道这是一个老问题,但也许其他人会觉得它很有用。如果您不想使用任何标记化库/类,这里有一个函数可以扫描字符串以查找精确的子字符串(没有提到的问题)。此外,它几乎不使用任何额外的内存(字符串数据不复制):

bool strstrexact(const char *str, const char *substr, const char *delim, const bool isRecursiveCall = 0)
{
    static int substrLen;
    if (!isRecursiveCall)
        substrLen = strlen(substr);
    if (substrLen <= 0)
        return FALSE;
    const char *occurence = strstr(str, substr);
    if (occurence == NULL)
        return FALSE;
    occurence += substrLen;
    if (*occurence == '')
        return TRUE;
    const char *nextDelim;
    nextDelim = strstr(occurence, delim);
    if (nextDelim == NULL)
        return FALSE;
    if (nextDelim == occurence)
        return TRUE;
    return strstrexact(nextDelim, substr, delim, TRUE);
}

如果找到子字符串,则返回TRUE;如果没有找到,则返回FALSE。在我的情况下,以下是我如何使用它:

if (strstrexact((const char*) glGetString(GL_EXTENSIONS), "WGL_ARB_pixel_format", " ")) {
    // extension is available
} else {
    // extension isn't available
}