ここにC++の問題がありますが、これは単純に理解できません。
私は2つのわずかに異なる機能を持っています。どちらもまったく同じことをする必要があります。ただし、正しく機能するのは1つだけです。
メソッド1:メソッドの入力は'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(...);
}
}
方法2:
void setUniformSampler(Gluint program, GLuint sampler) {
GLint uniformLocation = glGetUniformLocation(program, "test"); // returns 0
if(uniformLocation >= 0) {
glUniform1i(uniformLocation, sampler);
} else {
throw exception(...);
}
}
ご覧のとおり、glGetUniformLocationは2つの異なる値を返します。正しい戻り値は、「-1」ではなく「0」になります。では、2つの呼び出しの違いは正確には何でしょうか。
quote: "c_str()は、文字列オブジェクトと同じ内容のnullで終了する文字シーケンス(c-string)を生成し、それを文字配列へのポインタとして返します"。そして、それこそが、メソッドglGetUniformLocation(...)が2番目のパラメーターとして必要とするものです。では、なぜ上記の方法2だけが成功するのでしょうか。コンパイラの問題ですか?
Win7でMSVisualStudio2008を使用しています。
私はこのバグを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(...);
}
}