#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. Спасибо за вашу помощь, теперь я иду спать.