Как использовать glDrawElements, сохраняя правильные координаты текстуры? - программирование
Подтвердить что ты не робот

Как использовать glDrawElements, сохраняя правильные координаты текстуры?

Я использую/нацеливаю 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.

Ресурсы, которые не помогли:

Это вещи, которые я обнаружил, которые связаны, но кажутся мне (я) устаревшим использованием/не ответил/не совсем то, что я прошу. Не стесняйтесь указать мне на один из этих сообщений, если он действительно отвечает на мой вопрос.

Это, кажется, говорит, что glDrawElements бесполезен для куба и что у вас должны быть отдельные вершины, составляющие лица. Это относится также к 2-й сетке?

Ответ на этот вопрос говорит (между прочим): "Два квадрата с одинаковыми позициями вершин, но разные координаты текстуры должны быть представлены разными квадратиками". но я не понимаю, что он получает.

Этот, я думал, был близок. В ответ: первая ссылка сломана/доступ запрещен. Вторая ссылка имеет ответ, в основном говорящий, что вершины должны быть разными. Это необходимо? В третьей ссылке (второй фрагмент кода) они, похоже, просто генерируют все 36 вершин. Для одного куба это, вероятно, нормально, но для n кубов..? Могу ли я пропустить точку его примера, возможно?

Является ли то, что я запрашиваю, даже возможно? Я использую совершенно неправильные функции для достижения того, чего я пытаюсь достичь? "UR DOIN IT RONG"?

Я подумал о переустановке координат, чтобы он выглядел так:

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

Но я не видел, как это исправить проблему, так как вершины по-прежнему доступны.

Спасибо, и не стесняйтесь исправить меня/мой вопрос. Первый, поэтому я ожидаю, что он будет нуждаться в пересмотре.

4b9b3361

Ответ 1

Вторая ссылка имеет ответ, который в основном говорит, что вершины должны быть разными. Это необходимо?

Да. Вы хотите, чтобы каждый отдельный квад имел координаты текстуры, которые идут от 0 до 1. Это означает, что позиции, составляющие правую часть первого квадроцикла, не могут использовать те же координаты текстуры, что и позиции, составляющие левую часть второй квад.

И так как вы не можете иметь ту же позицию с двумя разными координатами текстур, вы должны дублировать свои позиции.