1

我在这里有一个 C++ 问题,我根本无法理解。

我有 2 个略有不同的功能。他们俩都应该做同样的事情。但只有一个可以正常工作。

方法一:方法的输入是'const string samplerName = "test"'


void setUniformSampler(Gluint program, const string samplerName, GLuint sampler) {
    GLint uniformLocation = glGetUniformLocation(program, samplerName.c_str()); // returns -1

    if(uniformLocation >= 0) {
        glUniform1i(uniformLocation, sampler);
    } else {
        throw exception(...);
    }
}

方法二:


void setUniformSampler(Gluint program, GLuint sampler) {
    GLint uniformLocation = glGetUniformLocation(program, "test"); // returns 0

    if(uniformLocation >= 0) {
        glUniform1i(uniformLocation, sampler);
    } else {
        throw exception(...);
    }
}

如您所见,glGetUniformLocation 返回 2 个不同的值。正确的返回值是“0”,而不是“-1”。所以我想知道,这两个电话之间到底有什么区别?

引用:“c_str() 生成一个以空字符结尾的字符序列(c-string),其内容与字符串对象相同,并将其作为指向字符数组的指针返回”。这正是 glGetUniformLocation(...) 方法作为其第二个参数所需要的。那么,为什么只有上面的方法 2 成功了呢?是编译器的问题吗?

我在 Win7 上使用 MS Visual Studio 2008。

我一直在寻找这个错误近 2 天了。我真的很想澄清这一点。它把我逼疯了...

谢谢沃尔特

编辑:

这也不起作用。


void setUniformSampler(Gluint program, const string samplerName, GLuint sampler) {
    const GLchar* name = samplerName.c_str();

    GLint uniformLocation = glGetUniformLocation(program, name); // still returns -1

    if(uniformLocation >= 0) {
        glUniform1i(uniformLocation, sampler);
    } else {
        throw exception(...);
    }
}

4

3 回答 3

0

检查参数的实现和类型glGetUniformLocation(parameter),“test”是一个常量字面量,它的生命和位置在可执行文件的生命周期中永远不会改变,而 c_str() 是从字符串对象动态计算的,它会在字符串对象死亡时死亡。

换句话说,你需要检查一下glGetUniformLocation()才能找到原因,我猜这与一些CRT字符串函数有关。

于 2010-12-09T06:54:36.787 回答
0

您可能会成为宽字符与细长(即 8 位)字符串混合的受害者。如果您的着色器源和统一名称都定义为静态字符串,那么它们将在字符串表示上达成一致。string::c_str 可能会改变这一点,因为 c_str 将始终返回一个 char 字符串,即它不支持 wchar。

从技术上讲,它应该有所作为,因为无错误的着色器编译器使用明确的内部表示。但是可能存在一个错误,即宽字符和细字符之间的差异被解释为不同的标识符。

如果你也通过 string::c_str 传递着色器源会发生什么?还要检查字符串变量的调试器 hexedit 视图。如果它看起来像这样:

00000000  74 65 73 74 0a                                    |test.|

你得到一个 8 位的字符串。如果它看起来像这样:

00000000  74 00 65 00 73 00 74 00  0a 00                    |t.e.s.t...|

然后你得到一个宽字符串。然后将其与提供着色器的变量进行比较。

于 2010-12-09T10:04:36.997 回答
0

您的参数是 const,您不能在 const 对象上调用非常量函数。也许这就是问题所在?该函数需要一个指向以空字符结尾的字符串的指针。确保这是你给它的。

于 2010-12-09T06:23:03.047 回答