15

OpenGL 4.20、GSLSL 4.20、コアを使用/ターゲティングしています。Cを使用します。

私はOpenGLでグラフィックスを調査していて、タイルベースのゲームを作成することにしました。私は実際にたくさんのタイルを描きたいと思っているところです。そして、glDrawElementsを使って個々の三角形を描き込もうとしています。

関連コード:

const float vertexPositions[] = {
  -1.0f, -0.8f, //0
  -0.8f, -0.8f, //1
  -0.6f, -0.8f, //2
  -0.4f, -0.8f, //3
  -0.2f, -0.8f, //4
   0.0f, -0.8f, //5

  -1.0f, -1.0f, //6
  -0.8f, -1.0f, //7
  -0.6f, -1.0f, //8
  -0.4f, -1.0f, //9
  -0.2f, -1.0f, //10
   0.0f, -1.0f, //11

//The following are the texture coordinates.
  0.00f, 1.00f,
  1.00f, 1.00f,
  0.00f, 1.00f,
  1.00f, 1.00f,
  0.00f, 1.00f,
  1.00f, 1.00f,

  0.00f, 0.00f,
  1.00f, 0.00f,
  0.00f, 0.00f,
  1.00f, 0.00f,
  0.00f, 0.00f,
  1.00f, 0.00f,
};

const GLubyte indices[] = {
  0, 1, 6, 
  1, 7, 6, 
  1, 2, 7, 
  2, 8, 7, 
  2, 3, 8, 
  3, 9, 8,
  3, 4, 9,
  4, 10, 9,
  4, 5, 10,
  5, 11, 10,
};

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void *)96);

glDrawElements(GL_TRIANGLES, 30, GL_UNSIGNED_BYTE, indices);

(他にもありますが、ほとんどはフォーマット/属性の有効化などです。必要に応じてさらに提供します)。

基本的に私が得るものは次のとおりです。

0  1  2  3  4  5
+--+--+--+--+--+
|b | d|b |d |b |
+--+--+--+--+--+
6  7  8  9 10 11

そして私が欲しいのは:

0  1  2  3  4  5
+--+--+--+--+--+
|b |b |b |b |b |
+--+--+--+--+--+
6  7  8  9 10 11

ここで、「b」はテクスチャ/正方形の正しい方向であり、「d」は逆/反射です。

頂点座標が共有されているので、これが起こるだろうと思いますが、私自身の考え/以下のいくつかの投稿から、それは避けられないようです。頂点を保存してテクスチャを反映するか、3 * 2 * number_of_tiles頂点を送信することになります。これは、glDrawElementsの目的を損なうと感じます。

役に立たなかったリソース:

これらは関連していると私が見つけたものですが、(私には)非推奨の使用法/回答されていない/私が求めているものではないようです。実際に私の質問に答える場合、これらの投稿の1つに戻ってください。

これは、glDrawElementsが立方体には役に立たないこと、および面を構成する個々の頂点が必要であることを示しているようです。これは2Dグリッドにも当てはまりますか?

この質問への答えは、(とりわけ)「同じ頂点位置を持つ2つの正方形ですが、異なるテクスチャ座標は異なる四角形で表される必要があります」と述べています。しかし、私は彼が何をしているのか理解していません。

これは近いと思いました。答え:最初のリンクが壊れている/アクセスが拒否されました。2番目のリンクには、基本的に頂点が別個でなければならないという答えがあります。これは必要ですか?3番目のリンク(2番目のコードスニペット)では、36個の頂点すべてを生成しているように見えます。1つのキューブの場合、これはおそらく問題ありませんが、n個のキューブの場合..?私は彼の例の要点を見逃しているのでしょうか?

私が要求していることは可能ですか?達成しようとしていることに対して完全に間違った関数を使用していますか?「URDOINITRONG」?

次のように座標を再配置することを考えました。

0  2  4  6  8 10
+--+--+--+--+--+
|  |  |  |  |  |
+--+--+--+--+--+
1  3  5  7  9 11

しかし、頂点はまだ共有されているので、それが問題をどのように修正するかはわかりませんでした。

ありがとう、そして私/私の質問を自由に訂正してください。最初のものなので、修正が必要だと思います。

4

1 に答える 1

4

2番目のリンクには、基本的に頂点が異なる必要があるという回答があります。これは必須ですか?

はい。個々のクワッドに 0 から 1 までのテクスチャ座標を持たせたいとします。つまり、最初のクワッドの右側を構成する位置は、左側を構成する位置と同じテクスチャ座標を使用することはできません。 2番目のクワッド。

また、2 つの異なるテクスチャ座標で同じ位置を持つことはできないため、位置を複製する必要があります。

于 2012-11-01T02:55:07.450 に答える