1

GL_QUAD_STRIPのテクスチャ座標を指定する方法を理解しようとしています。

私はなんとか1つのクワッドで物事を機能させることができました:

float vertices[] = { 0.0f, 0.0f, 1.0f,   +1.0f, 0.0f, 0.0f,  // bottom line
                     0.0f, 1.0f, 1.0f,   +1.0f, 1.0f, 0.0f}; // top line

unsigned int indices[] = {2, 0,  // x =  0
                          3, 1}; // x = +1

float textureCoordinates[] = { 1.0f, 0.0f, 
                               0.0f, 0.0f,
                               1.0f, 1.0f,
                               0.0f, 1.0f};
...

glBindBuffer(GL_ARRAY_BUFFER, 0); // unbinds any buffer object previously bound
glTexCoordPointer(2, GL_FLOAT, 0, textureCoordinates);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibufferid);
glDrawElements(GL_QUAD_STRIP, 4, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

結果は次のようになります(画像付きの白い長方形、説明のために残りが描かれています): ここに画像の説明を入力してください

ただし、textureCoordinates[]の選択の背後にあるロジックを理解していません:-(。

最初のテクスチャ座標は(1,0)です。これは右下隅に対応すると思いますか?

また、OpenGLが最初のインデックスを読み取るとき:2、これを使用して頂点を検索すると仮定します:(0,1,1):左上隅。次に、最初のテクスチャ座標(1,0)を読み取ります。しかし、前述のように、これはテクスチャの右下隅であると想定します!?

ただし、テクスチャは回転せずに表示されるため、これは当てはまりません!?

4

1 に答える 1

2

頂点と同様に、テクスチャ座標も。で使用されるインデックスに基づいて選択されglDrawElements()ます。したがって、最初のテクスチャ座標は(1,0)ではなく、(1,1)です。これは、最初のインデックスが2であるためです。頂点と座標は、次の表に従います。ここで、i =インデックス、v =頂点、t=テクスチャ座標です。 。(この場合、z座標は実際には重要ではないため、頂点についてはx座標とy座標のみを考慮します。)

i   v     t
2 (0,1) (1,1)
0 (0,0) (1,0)
3 (1,1) (0,1)
1 (1,0) (0,0)

これを一枚の紙に描くと、インデックスが重要なので、これは座標がより理にかなっていることを意味していることがわかります。(これを行うことをお勧めします!何が起こっているのかを理解するためにこれを行う必要がありました。)表で、特定のインデックスの頂点座標とテクスチャ座標の間でy座標が完全に一致していることに注目してください。ただし、x座標は一致しません。頂点がx = 0の場合、テクスチャ座標はx = 1であり、その逆も同様です。これにより、画像が回転するのではなく、y軸を中心にミラーリングされて表示されると思います。元の画像はどのように見えますか?建物が左側になるように、投稿した画像に表示されているものと比較してミラーリングされていますか?もしそうなら、テクスチャ座標が説明になります。その場合、テクスチャ座標2と3は場所を切り替える必要があります。

興味がある場合は、18ページのOpenGL 2.1仕様(図2.5(a))を見て、頂点インデックスがそのまま選択された理由を確認してください。スクリーンに投影すると、反時計回りに指定された頂点を持つクワッドが作成されます。glFrontFace()の初期値がであるため、これは適切です。GL_CCWつまり、レンダリングされたイメージにポリゴンの前面が表示され、カリングが有効になっている場合はポリゴンはカリングされませんでした( glCullFace ()を参照)。(ただし、カリングはデフォルトでは有効になっていないため、場合によっては問題になる場合と問題にならない場合があります。)

これがお役に立てば幸いです。不明な点がある場合はコメントしてください。

于 2013-01-07T23:51:42.383 に答える