Как работают координаты текстуры opengl? - PullRequest
55 голосов
/ 04 апреля 2011

Я знаю, что перед каждым вызовом glVertex мне нужно вызывать одно из следующих действий:

glTexCoord(0,0); 
glTexCoord(0,1); 
glTexCoord(1,1); 
glTexCoord(1,0); 

Но я понятия не имею, что они имеют в виду. Однако я знаю, что если я умножу (или это делю?) Правую сторону (или это все?) На два, моя текстура увеличится, и если я сделаю обратное, моя текстура будет повторяться дважды. Мне удалось закодировать текстурный атлас, применяя операции, пока он не заработал. Но у меня есть правильное представление о том, что происходит. Почему их разделение влияет на изображение и почему их отражение отражает его? Как работают координаты текстуры?

Ответы [ 4 ]

118 голосов
/ 04 апреля 2011

Координаты текстуры указывают точку на изображении текстуры, которая будет соответствовать вершине, для которой вы их указываете. Представьте прямоугольный резиновый лист с напечатанным на нем изображением текстуры, где длина каждой стороны нормализована до диапазона 0-1. Теперь предположим, что вы хотите нарисовать треугольник, используя эту текстуру. Вы бы взяли 3 булавки и поместили бы их в резиновый лист в положениях каждой из ваших желаемых текстурных координат. (Скажите [0, 0], [1, 0] и [1, 1]), затем переместите эти контакты (не вынимая их) в желаемые координаты вершины (Скажите [0, 0], [0.5, 0] и [ 1, 1]), так что резиновый лист растягивается и изображение искажается. Это в основном то, как работают текстурные координаты.

Если вы используете текстурные координаты больше 1 и ваша текстура настроена на повторение, то это похоже на то, что резиновый лист был бесконечного размера и текстура была наложена на него. Поэтому, если ваши координаты текстуры для двух вершин были 0, 0 и 4, 0, то изображение должно было бы повторяться 4 раза между этими вершинами.

enter image description here @ b1nary.atr0phy Изображение для всех визуальных мыслителей!

9 голосов
/ 04 апреля 2011

OpenGL использует обратное текстурирование.Он переводит координаты из мирового пространства (X, Y, Z) в текстурное пространство (X, Y) в дискретное пространство (U, V), где дискретное пространство находится в области [0,1].

Возьмите многоугольник, думайте об этом как лист бумаги.При этом:

glTexCoord(0,0); 
glTexCoord(0,1); 
glTexCoord(1,1); 
glTexCoord(1,0); 

Вы говорите OpenGL рисовать на всем листе бумаги.Когда вы применяете изменения, ваше текстурное пространство изменяется в соответствии с заданными координатами.Вот почему, например, когда вы делите, вы получаете одну и ту же текстуру дважды, вы указываете OpenGL отображать половину вашего листа, а не весь лист бумаги.

6 голосов
/ 22 июня 2013

Глава 9 Красной книги объясняет это подробно и доступна бесплатно онлайн.

http://www.glprogramming.com/red/chapter09.html

Текстурные координаты отображают x, y в пространство 0-1 в текстурном пространстве ширины и высоты. Это тогда растянуто как резиновый лист по треугольникам. Лучше всего это объяснить картинками, и Красная книга делает это.

3 голосов
/ 15 апреля 2016

Для текстур 2D-изображения 0,0 в координатах текстуры соответствует нижнему левому углу изображения, а 1,1 в координатах текстуры соответствует верхнему правому углу изображения.Обратите внимание, что «нижний левый угол изображения» находится не в центре нижнего левого пикселя, а на краю пикселя.

Также интересно при загрузке изображений:

8.5.3 Структура изображения текстуры

Само изображение текстуры (на которое ссылаются данные) представляет собой последовательность групп значений.Первая группа - нижний левый задний угол изображения текстуры.Последующие группы заполняют строки шириной шириной слева направо;высотные ряды укладываются снизу вверх, образуя один двумерный срез изображения;и срезы глубины накладываются сверху вниз.

Обратите внимание, что в большинстве форматов изображений данные начинаются сверху, а не с нижней строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...