Radeon 3870HD を使用して、AMD のドライバーで奇妙な動作に遭遇しました (昨日、利用可能な最新バージョンに更新されました)。
まず、NVIDIA GeForce 540M でコード全体が問題なく動作し、glGetUniformLocation が常に失敗するわけではないことに注意してください。
したがって、私の問題は、アプリで使用されているシェーダー プログラムの 1 つを使用して glGetUniformLocation から奇妙な値を取得し、他のシェーダー プログラムにはそのような欠陥がないことです。そのシェーダーをフレーム間で切り替えるので、一時的なものではなく、そのシェーダーに関連していると確信しています。奇妙な値とは、17-26 のようなものを意味しますが、ユニフォームは 9 つしかありません。取得したばかりの変数を使用して GLSL 変数のタイプを照会するシェーダー用のインターフェイスを使用しています。副作用として、その名前も照会します。返された 17 ~ 26 の場所すべてについて、名前が設定されておらず、タイプも同じでした。今、別のライブラリであるインターフェイスにデバッグし、それらの値を私が期待するものに変更することを考えています: 0-8. デバッガーを使用してこれらを変更したところ、実際にそのシェーダーで適切な変数名が返され、型も正しいものでした。
私の質問は、常に NVIDIA で動作し、Radeon の他のシェーダーでも動作しているコードが、同じように扱われる別のシェーダーでは異なる動作をする可能性があるということです。
このためのインターフェイスの関連部分を含めます。
//this fails to return correct value
m_location = glGetUniformLocation(m_program.getGlID(), m_name.c_str());
printGLError();
if(m_location == -1){
std::cerr << "ERROR: Uniform " << m_name << " doesn't exist in program" << std::endl;
return FAILURE;
}
GLsizei charSize = m_name.size()+1, size = 0, length = 0;
GLenum type = 0;
GLchar* name = new GLchar[charSize];
name[charSize-1] = '\0';
glGetActiveUniform(m_program.getGlID(), m_location, charSize, &length, &size, &type, name);
delete name; name = 0;
if(!TypeResolver::resolve(type, m_type))
return FAILURE;
m_prepared = true;
m_applied = false;