私はPythonの男ではないので、何かが足りないかもしれません。
すべてのフラグメントを黒くレンダリングするには、次のいずれかを行う必要があります。
- テクスチャ データが読み込まれていません
- テクスチャはそのシェーダーのサンプラーにバインドされていません
- 照明計算に何か問題があります
- ユニフォームがシェーダーに正しく送信されない
- 法線の不適切な属性 (すべて 0 の場合など)。
あなたのシェーダーはfinalColor = texture(tex, fragTexCoord);、照明の計算とユニフォームを除外するストレートなので. したがって、テクスチャ サンプラーに何か問題があるはずです。
iOS でテクスチャをバインドするときは、次のことを行う必要があります。
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(glUniforms[U_textureSampler], 0);
そして、同じ手順を適用する必要があると思います。たぶんtexturebuffer.bind()、あなたのためにそれらのステップの1つ以上を行います。しかし、それ以外の場合は、テクスチャ サンプラーを有効にしてバインドし、ユニフォームをセットアップする必要があります。
アクティブ化されていないテクスチャは、黒く表示されることがあります。正しく設定されていないユニフォームは、おそらくそのユニフォームに対して 0 を返します。
どこかで、レンダリング時にバインドしているテクスチャにシェーダーから「uniform sampler2D tex」を接続する必要があります。
また、テクスチャ ID を呼び出すのは紛らわしく、おそらく悪い形だと思いますtex(返されるものでglGenTextures、均一な「tex」も呼び出します。これらは 2 つの異なるものです。1 つはテクスチャ ID で、もう 1 つは均一変数です)。 .
私が最初に行うことは、ID の名前を から に変更しtexてtexID、それらを頭に入れておくことです。次に、コードのどこにも glsl 均一変数の均一な場所 (glGetUniformLocation) を取得していないことがわかるかもしれません。ところでtex、これはシェーダーがコンパイルされた後に行う必要があります。たぶん、私が見ていないPythonにヘルパーがあるのでしょう。
しかしtexture buffer.bind、統一変数「tex」に接続するのはどこですか?
* 更新 1 *
その均一な場所を取得して使用する方法に関する提案。シェーダーがコンパイルされた後にこれを行います。統一されたロケーション ID をアプリに返します。
u_tex = glGetUniformLocation(shader, "tex")
そのテクスチャ ID 変数を次texIDのように変更します。
texID = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, texID)
次に、テクスチャをバインドして使用するときに表示ループで次のことを行います。
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, texID)
glUniform1i(u_tex, 0)
そして、私は何をするかわからないことを認めなければなりませんtexturebuffer.bind()。したがって、おそらくその行の前または後のいずれかで上記の 3 行を試してください。
* 更新 2 *
glEnable(GL_TEXTURE_2D)glTexParameter のものと一緒にそこにあるはずのものも欠落していることに気付きました。それらの行の上に追加します。
* 更新 3 *
シェーダーでのテストと同じように、ボックスを置き換えfinalColor = texture(tex, fragTexCoord);てfinalColor = vec4(1.0,0.0,0.0,1.0);、ボックスが赤くなるかどうかを確認します。今考えると何が何だかわからないからfinalColorです。である必要がありますgl_FragColor =。
* 更新 4 *
上記のテストを行い、フラグメントの色を手動で設定できることを確認してください。あなたが OpenGL 3.0 を使用していることに気づきませんでした。2.0を考えていました。出力変数名は glsl のバージョンによって異なります。バージョンを 1.3 に設定しました。この投稿を参照して、その部分も正しく行っていることを確認してください:フラグメント シェーダーは、ピクセルの色に使用する変数をどのように認識していますか?