私は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を返しますが、使用するテクスチャは正しいです。私はいくつかの作業の後に問題を解決するために管理
シェーダも投稿する必要があります。 –
名前を付けてみましたか(テクスチャは組み込みのGLSL関数ですが、技術的にはキーワードではありませんが、これは動作するとは限りません)。 – KillianDS
私は "myTexture"に制服の名前を変更しようとしましたが、残念ながら結果は同じです。 – fescrb