0

テクスチャは単純にレンダリングされず、ジオメトリはすべて黒です。

スクリーンショット: http://i.imgur.com/ypMdQY4.png

コード: http://pastebin.com/SvB8rxxt

レンダリングしようとしているテクスチャと transforms.py モジュールにもリンクしますが、2 つ以上のリンクを配置できるという評判はありません。「modern opengl 02」をグーグルで検索すると、前者を取得したチュートリアルが表示され、「transformations py」を検索すると後者が表示されます。

「TEXTURE STUFF START」を検索して、テクスチャが設定されている場所を見つけます。

すべての部分 (画像の読み込み、テクスチャの読み込み、テクスチャ座標データ、シェーダー) を突っ込んでみましたが、どれが問題なのかを実際に判断する方法がわかりません。

更新: いくつかの潜在的な問題を修正してコードを更新しましたが、それでも同じ問題が発生しています。

4

1 に答える 1

1

私はPythonの男ではないので、何かが足りないかもしれません。

すべてのフラグメントを黒くレンダリングするには、次のいずれかを行う必要があります。

  1. テクスチャ データが読み込まれていません
  2. テクスチャはそのシェーダーのサンプラーにバインドされていません
  3. 照明計算に何か問題があります
  4. ユニフォームがシェーダーに正しく送信されない
  5. 法線の不適切な属性 (すべて 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 の名前を から に変更しtextexID、それらを頭に入れておくことです。次に、コードのどこにも 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 に設定しました。この投稿を参照して、その部分も正しく行っていることを確認してください:フラグメント シェーダーは、ピクセルの色に使用する変数をどのように認識していますか?

于 2014-06-19T00:17:30.513 に答える