Текстурирующие треугольники OpenGL

#c #opengl

#c #opengl

Вопрос:

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

Я текстурирую каждый прямоугольный треугольник с помощью UV-координат (0,1), (0,0), (1,0) и (0,1), (1,1), (1,0) в зависимости от того, в каком направлении находится треугольник.

отрисовка кода.

     glBindTexture(GL_TEXTURE_2D, m_texture.id());

    //glEnableClientState(GL_INDEX_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    //glIndexPointer(GL_INT, 0, amp;m_indices[0]);
    glVertexPointer(3, GL_FLOAT, sizeof(VertexData), amp;m_vertexData[0].x);
    glNormalPointer(GL_FLOAT, sizeof(VertexData), amp;m_vertexData[0].nx);
    glTexCoordPointer(2, GL_FLOAT, sizeof(UVData), amp;m_uvData[0].u);

    glDrawElements(GL_TRIANGLES, m_indices.size(), GL_UNSIGNED_INT, amp;m_indices[0]);
    glBindTexture(GL_TEXTURE_2D, 0);
  

режим переноса текстуры — это GL_CLAMP_TO_EDGE

Скриншот

Редактировать

выводя первые два треугольника, я получаю значения…

Треугольник 1:

Индексы (0,1,31)

Vertex0 (-15, 0, -15), Vertex1 (-15,0,-14), Vertex31 (-14, 0, -14)

УФ (0,1), (0,0), (1,0)

Треугольник 2:

Индексы (0, 30, 31)

Vertex0(-15, 0, -15), Vertex30(-14, 0, -15), Vertex31 (-14, 0, -14)

УФ (0, 1), (1, 1), (1, 0)

Для потомков полный код находится здесь

Два треугольника образуют квадрат с разрезом по диагонали сверху слева направо снизу справа.

Комментарии:

1. Вы имеете в виду UV0, UV1, UV31 и UV0, UV30 и UV31, верно?

2. @arasmussen, ты прав насчет UV0, 1, 31, я передал 0,1,2. Я неправильно понял индексы. Я думаю, что у меня может быть только 1 значение UV для каждой вершины.

3. Верно. Так что на самом деле, вы должны упаковать это в свой VertexData.

Ответ №1:

Не используйте glIndexPointer, это не то, что вы думаете, он используется для режима цветового индекса, для создания индексированных сеток просто используйте glDrawElements.

Комментарии:

1. lol Спасибо, именно так мой лектор показал нам, как его использовать, и он отчаянно нуждается в повторном изучении темы. Это не решает мою проблему, хотя: (

2. Вам все равно не следует включать состояние клиента для массива индексов.

3. @Jim Buck, я больше не, я забыл прокомментировать включение в сообщении выше. После удаления всего массива индексов у меня все еще остается странная текстура.

4. @arasmussen VertexData — это структура, которая содержит данные vertx и нормали, с плавающей точкой x, y, z, nx, ny, nz. Она будет правильно рисовать примитивы, но не текстурировать их правильно.

5. @PhilCK Попробуйте удалить sizeof(UVData) и изменить его на 0. Дайте мне знать, что это дает.

Ответ №2:

Похоже, вы связываете UV-данные с индексами, а не с вершинами. Данные UV являются частью данных vertex, поэтому вам, вероятно, следует упаковать их в объект VertexData, а не хранить отдельно. Вы можете сохранить их отдельно, но вам нужно по одному на вершину, а не по одному на индекс.

Комментарии:

1. Спасибо за вашу помощь, теперь я иду спать.