1

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;
4

1 に答える 1

2

渡すインデックスは、統一された場所であるとは想定されてglGetActiveUniformません。統一された場所は通話でのみ使用されます。glUniform他には何もありません。

渡すglGetActiveUniformインデックスは、0 と によって返される値の間の単なるインデックスですglGetProgram(GL_ACTIVE_UNIFORMS)。どの制服が存在するかを尋ねたり、それらの制服の特性を調べたりするために使用されます。

あなたのコードが NVIDIA で動作するのは、運が良かったからです。OpenGL 仕様では、均一な位置の順序がアクティブな均一なインデックスの順序と同じであることは保証されていません。AMD のドライバーはそのようには機能しないため、コードは機能しません。

于 2012-04-23T09:20:23.833 に答える