4

OpenGL Triangles にマップされたスプライトを表示するという概念がわかりません。

OpenGL ES が三角形と点のみを描画する場合、三角形以外の形状をどのように表示/マッピングしますか?

三角形にマップされた形状が歪まないのはなぜですか?

説明する:

私の考えでは、たとえばマリオのスプライトを三角形にマッピングすると、歪んだり切り取られたりしたマリオが生成されます。そのような場合、頭は押しつぶされたり、見えなくなったりします。

4

4 に答える 4

6

私が懸念を正しく理解している場合:正方形を2つの三角形に分割し、テクスチャ座標を使用してそれに応じてテクスチャを分割します。正しく行うと、まるでスプライトであるかのように、画面に1:1でテクスチャが描画されます。(もちろん、回転やストレッチなどのオプションもあります。)

0     1  <-- If your square is divided up like this, say, set texcoord
+-----+      for point 0 to be the top left of the sprite; for point 3, the
|\    |      bottom right of the sprite; and correspondingly, for points
| \   |      1 and 2.
|  \  |
|   \ |
|    \|
+-----+
2     3

結局のところ、期待どおりにスクイーズされたスプライトを取得することはできません。上の写真から三角形0-3-2を描画していると想像します。たとえば、明白な方法でマッピングし、上部のスキャンラインを1つのポイント(ポイント0)に無限に絞り込みますか?ただし、実際には、ポイント0のテクスチャ座標は1つしかないため、これは発生しません。したがって(ポイント2と3が適切にマッピングされている場合)、スプライトの切り抜かれた部分しか取得できません。

(とはいえ、同じtexcoordを2つのポイントに割り当てることも、テクスチャをそれ自体に交差させて、そのように間違えることもできます。混乱させる余地はまだたくさんあります。心配しないでください。)

これはOpenGLプログラミングガイドで説明されていますが、私がこのことを学んでから何年も経っているので、問題が発生した場合にどれほど役立つかわかりません:http: //glprogramming.com/red/chapter09.html

于 2010-05-28T14:49:57.870 に答える
5

非常に簡単に言えば、3つのテクスチャ座標(頂点ごとに1つ)のみを選択するため、テクスチャが歪むことはありません。上で概説したように2つの三角形を使用し、テクスチャのさまざまな部分を「クリップ」する必要があります。

こことこの投稿の残りの部分でのASCIIアートの私の恐ろしい使用を許してください:

  Polygon     Texture        ADB        ACD
  A-----C  |  x-----x  |  x        |  x-----x
  |\    |  |  | ___ |  |  |        |    ___ |
  | \   |  |  |<o.o>|  |  |<o      |     .o>|
  |  \  |  |  | ### |  |  | ##     |      # |
  |   \ |  |  | -|- |  |  | -|-    |        |
  |    \|  |  | / \ |  |  | / \    |        |
  B-----D  |  x-----x  |  x-----x  |        x

ADBとACDの2つの三角形を作成します。ポイントAはテクスチャの左上にマップされ、Bは左下にマップされ、Cは右上にマップされ、Dは右下にマップされます。いずれかの三角形のみをマップする場合、スプライト(または、より複雑な形状の場合はテクスチャ)の半分しか取得できません。同じことが、より大きなまたはより複雑なポリゴンにも当てはまります。テクスチャは単一の統合されたピースにすることができますが、各頂点のテクスチャ座標は、ジオメトリ自体と同じ方法でそれをスライスする必要があります。

より複雑な例、六角形:

   a   b
    ___
   /   \
f /  .  \ c
  \  g  /
   \___/
  e     d

「G」の中点を追加し、それを6つの三角形(ABG、BCG、CDGなど)にスライスする場合は、使用しているテクスチャが一致するように座標方向にスライスされていることを確認する必要があります。GL_TRIANGLESを使用している場合は、テクスチャを六角形のままにしておくのが最も簡単なので、これは問題ではありませんが、ストリップやファンの描画を開始すると、追跡しなければ、反転、傾斜、または複製できます。描画順序により、どの頂点がテクスチャのどの部分にマッピングされているか。

余談ですが、2D画面整列クワッド(スプライトが一般的に使用されるもの)に関心がある場合は、iPhoneで利用可能なOES_Draw_Texture拡張機能を使用して、大幅な速度向上を実現しながら、心の痛みを軽減してください。

int rect[4] = {0, 0, 64, 64}; 
glBindTexture(GL_TEXTURE_2D, texMario); 
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect); 
glDrawTexiOES(playerX, playerY, spriteZ, width, height); 

は、切り取るテクスチャのrect座標を定義し(ピクセル単位で、これは64x64スプライトになります)、実際に呼び出してglDrawTexiOES、playerXとplayerYの左下隅にある画面ビューにテクスチャを配置します。

良かった、私でさえここで「tl;dr」の感覚を得る。申し訳ありません。

于 2010-06-03T13:27:28.760 に答える
3

その理由は、最下位レベルのレンダリング パイプラインにあり、すべて三角形です。多角形などのより複雑な形状は、テッセレーションと呼ばれるプロセスによって三角形の集まりに変換されます。

したがって、複雑なマリオ キャラクターをモデル化する場合、トリックは、実際には、マリオを 1 つの三角形ではなく、三角形のコレクションにすることです。

別の回答で、透明ピクセルについて言及しました。私は openGL の最新バージョンを使用していませんが、衝突はサーフェスとテクスチャの交差に基づく従来の定義であり、透明なものであっても考慮されていませんでした。

編集:

簡単なグーグルは、iDevGames.com の GL_TRIANGLE_STRIP を使用したソリューションを見つけました。URL はhttp://www.idevgames.com/forum/showpost.php?p=143983&postcount=6です。

関連する draw メソッドは次のとおりです。

- (void)drawView {

    // Replace the implementation of this method to do your own custom drawing

    const GLfloat squareVertices[] = {
        -0.5f, -0.5f,
        0.5f,  -0.5f,
        -0.5f,  0.5f,
        0.5f,   0.5f,
    };

    GLshort genericTexCoords[] = { 0, 1, 1, 1, 0, 0, 1, 0 };

    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(0, 0, backingWidth, backingHeight);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glRotatef(3.0f, 0.0f, 0.0f, 1.0f);

    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glVertexPointer(2, GL_FLOAT, 0, squareVertices);
    glTexCoordPointer(2, GL_SHORT, 0, genericTexCoords);

    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, sprite);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
于 2010-05-28T14:37:22.330 に答える
-1

openGL は実際に多角形を描画できますが、特に複雑な形状では通常、多角形を使用しない方が安全です。ポリゴンはそれ自体で「ねじれ」、正しくレンダリングできない無効な形状を作成する可能性があります。三角形では、これは決して起こりません。そのため、人々は通常、複雑な形状を三角形に分割します。

より完全な説明については、http://www.glprogramming.com/red/chapter02.html#name2を参照してください。

于 2010-05-16T23:22:48.317 に答える