0

私はプリミティブ、正確にはクワッドをテクスチャ マッピングしていました。テクスチャが反時計回りに 90 度回転しているという問題がありました。テクスチャの読み込みコードに問題があるのではないかと思っていたのですが、実は描画機能の問題でした。したがって、これは誤って絵を描くコードでした:

glVertex2f(0.0f, 0.0f); glTexCoord2f(0.0f, 1.0f);
glVertex2f(0.5f, 0.0f); glTexCoord2f(1.0f, 1.0f);
glVertex2f(0.5f, 0.5f); glTexCoord2f(1.0f, 0.0f);
glVertex2f(0.0f, 0.5f); glTexCoord2f(0.0f, 0.0f);

そして、これは私が意図したとおりに描いたものです。

glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(0.5f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(0.5f, 0.5f);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.5f);

この種の行動の原因は何ですか?これが絵にこんなに影響を与えるとは本当に思いませんでした。

4

4 に答える 4

2

これが絵にこんなに影響を与えるとは本当に思いませんでした。

考えてみてください。何をしglTexCoordますか?テクスチャ座標を指定していますよね?しかし、何のテクスチャ座標ですか?

はい、次の頂点のテクスチャ座標を指定していることはわかっていますが、OpenGL はそれを知りません。すべてglTexCoordのことは、メモリに渡す値を設定することです。

glVertexもっと何かをします。頂点の位置を設定しますが、OpenGL に「これまでに設定したすべての頂点値を取得し、それを使用して頂点をレンダリングします」とも伝えます。そのため、、 などで呼び出すことはできますが、glVertexの外で呼び出すことはできませglBegin/glEndglTexCoordglColor

つまり、glTexCoord(...); glVertex(...)「現在のテクスチャ座標を X に設定し、位置を Y に設定して、これらの値でレンダリングする」ということです。するとglVertex(...); glTexCoord(...);、「位置を Y に設定し、以前に設定した値でレンダリングしてから、現在のテクスチャ座標を X に設定します」と言っているのです。

OpenGL に頂点をレンダリングするように指示した後で、テクスチャ座標を設定するのは少し遅いです。

于 2012-04-17T18:20:24.790 に答える
0

glVertex と glTexCoord を呼び出す順序は重要です。glTexCoord、glColor などの頂点属性を指定するたびに、これらの属性のいずれかを再度変更するまで、描画するすべての将来の頂点が適用されます。したがって、前の例では、最初の頂点は特定されていない以前の tex coord で描画され、2 番目の頂点は tex coord (0.0, 1.0) で描画されていました。

于 2012-04-17T18:11:47.837 に答える
0

OpenGL は状態ごとに機能します。多くの GL 関数呼び出しは、現在の状態を変更するために使用されるため、他の関数を呼び出すときに、現在の状態を使用して適切な操作を実行できます。

あなたの状況では、 glVertex2f() 呼び出しは現在のテクスチャ状態を使用して、テクスチャのどの部分がどの頂点にマップされるかを定義します。最初の一連の呼び出しでは、glVertex2f() の最初の呼び出しには以前のテクスチャ状態がないため、未定義の動作である可能性もありますが、おそらくデフォルトで (0.0f, 0.0f) になります。glVertex2f への 2 番目の呼び出しは、glTexCoord2f() への最初の呼び出しによって設定された状態を使用し、次に glVertex2f() への 3 番目の呼び出しは、glTexCoord2() への2 番目の呼び出しによって設定された状態を使用します。

将来的には、これらの状態を使用する関数を呼び出す前に、適切な GL 状態を設定するようにしてください。

于 2012-04-17T18:16:52.217 に答える
0

おそらく最良の説明はオンラインにあります:テクスチャ マッピング - チュートリアル

また、念のため、テクスチャ座標 (texCoor) は次のとおりです。

そして、それらが呼び出される順序が重要です!

  • (0,0) 左下隅
  • (0,1) 左上隅
  • (1,0) 右下隅
  • (1,1) 右上隅
于 2012-04-17T22:11:43.257 に答える