2012-02-21 13 views
5

私はOpenGLとGLSLを使って単純なメッシュ上にテクスチャを描画しています。glUniformがサンプラー値を設定できません

私の問題は、glUniform1iを使用してsampler2Dユニフォームの値を設定しているときに、設定されていないということです。たとえば、このコードで中:

glUseProgram(programObject); 

glUniform1i(glGetUniformLocation(programObject, "texture"), 1); 
GLint val; 
glGetUniformiv(programObject, 
       glGetUniformLocation(programObject, "texture"), 
       &val); 
printf("Value is %d\n", val); 

コマンドラインでプリントアウトした値は、私はシェーダーが正しくコンパイルされ、プログラムが正しくリンクされていることを確認している0です。 glGetUniformLocationは、インデックス> 0を出力します。さらに、glGetErrorは、いつでもエラーを出力しません。

これは、ユニフォームがサンプラーである場合にのみ発生します。テクスチャが設定されていないので、シェーダでそれを調べると常に(0、0、0、1)が返されます。 (また、apitraceを使用して、私のテクスチャがGL_TEXTURE1に正しくバインドされていることを確認しました。これはコードの直後に行われます)。

私はこの問題を広範に調査しており、このhereのようなもののインスタンスが1つしか見つかりませんでした。解決策はGLEWを初期化することでしたが、これは私のためには機能しませんでした。

私は必要な拡張情報(またはapitraceからのトレース)を提供しています。

uniform sampler2D texture; 

varying vec2 textureCoord; 

void main() { 
    gl_FragColor = texture2D(texture, textureCoord); 
} 

ソリューション

私はいくつかの作業の後に問題を解決するために管理:ここで

編集

はシェーダです。

この問題は、実際の値にかかわらず常にサンプラーの0を返すように、均一化が設定されていないためではありませんでした。これはIntelのSandy Bridge用ドライバのもとでのみ発生しました。他の実装の下でコードをテストすると、常に正しいサンプラー値が返されました。

(0、0、0、1)を返すテクスチャの問題は、常にテクスチャの生成中に間違いがあったためです。

今でもglGerUniformivは0を返しますが、使用するテクスチャは正しいです。私はいくつかの作業の後に問題を解決するために管理

+0

シェーダも投稿する必要があります。 –

+2

名前を付けてみましたか(テクスチャは組み込みのGLSL関数ですが、技術的にはキーワードではありませんが、これは動作するとは限りません)。 – KillianDS

+0

私は "myTexture"に制服の名前を変更しようとしましたが、残念ながら結果は同じです。 – fescrb

答えて

3

ソリューション

この問題は、実際の値にかかわらず常にサンプラーの0を返すように、均一化が設定されていないためではありませんでした。これはIntelのSandy Bridge用ドライバのもとでのみ発生しました。他の実装の下でコードをテストすると、常に正しいサンプラー値が返されました。

(0、0、0、1)を返すテクスチャの問題は、常にテクスチャの生成中に間違いがあったためです。

今でもglGerUniformivは0を返しますが、使用するテクスチャは正しいです。