Jak korzystać z glDrawElements, zachowując poprawność współrzędnych Texture?

Używam / celuję w OpenGL 4.20, GSLSL 4.20, core. Korzystanie z C.

Badam grafikę za pomocą OpenGL i postanowiłem stworzyć grę opartą na kafelkach. Jestem w punkcie, w którym chciałbym narysować kilka płytek i próbuję użyć glDrawElements do rysowania pojedynczych trójkątów.

Odpowiedni kod:

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,
};

z

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);

(Są inne kawałki, ale to głównie formatowanie / włączanie atrybutów itp. W razie potrzeby zapewniam więcej).

Zasadniczo otrzymuję:

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

a czego chcę:

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

Gdzie „b” jest prawidłową orientacją tekstury / kwadratu, a „d” jest odwrotnością / odbiciem.

Zdaję sobie sprawę, że ponieważ współrzędne wierzchołków są współdzielone, to się stanie, ale z moich własnych myśli / niektórych postów poniżej wydaje się, że jest to nieuniknione. Albo zachowuję wierzchołki i odbijam tekstury, albo kończę na wysyłaniu wierzchołków 3 * 2 * liczba_płytek, co moim zdaniem pokonuje cel glDrawElements.

Zasoby, które nie pomogły:

Są to rzeczy, które znalazłem, które są powiązane, ale wydają się być dla mnie albo przestarzałe, albo nie odpowiadam, nie całkiem to, o co pytam. Jeśli chcesz, możesz skierować mnie z powrotem na jeden z tych postówrobi Odpowiedz na moje pytanie.

To zdaje się mówić, że glDrawElements jest bezużyteczny dla sześcianu i że tymusi mają pojedyncze wierzchołki tworzące twarze. Czy dotyczy to również siatki 2d?

Odpowiedź nato pytanie mówi (między innymi) „Dwa kwadraty o tych samych położeniach wierzchołków, ale różne współrzędne tekstury muszą być reprezentowane za pomocą różnych quadów”. ale nie rozumiem, o co mu chodzi.

Ten Myślałem, że jest blisko. W odpowiedzi: Pierwszy link jest uszkodzony / odmowa dostępu. Thedrugi link ma odpowiedź, która zasadniczo mówi, że wierzchołki muszą być różne. Czy to jest wymagane? W trzecim łączu (drugim fragmencie kodu) wydają się generować wszystkie 36 wierzchołków. Dla jednej kostki jest to prawdopodobnie ok, ale dla n kostek ..? Czy może brakuje mi jego przykładu?

Czy to, o co proszę, jest możliwe? Czy używam całkowicie niepoprawnych funkcji do tego, co próbuję osiągnąć? „UR DOIN IT RONG”?

Pomyślałem o zmianie układu współrzędnych, aby wyglądało to tak:

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

Ale nie widziałem, jak to rozwiąże problem, ponieważ wierzchołki są nadal udostępniane.

Dziękuję i nie krępuj się mnie poprawić. Pierwszy, więc oczekuję, że będzie wymagał rewizji.

questionAnswers(1)

yourAnswerToTheQuestion