Почему можно встретить координату текстуры больше 1 или меньше 0

11

Я изучаю текст о texture mappingи на preparing to drawсессии, я читаю:

Определите параметры обтекания текстуры. Это будет контролировать то, что происходит, когда координата текстуры больше 1,0 или меньше 0,0:

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,wrap);  
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,wrap);  

где обтекание:
GL_REPEAT: указывает, что этот шаблон будет повторяться (т. е. обтекание), если встретятся преобразованные координаты текстуры меньше 0,0 или больше 1,0.

GL_CLAMP: указывает, что шаблон будет «придерживаться» значения 0,0 или 1,0.

Но нет объяснения, что является причиной появления таких текстурных координат?
Например, предположим, что я только что нарисовал прямоугольник и хочу применить к нему изображение в качестве текстуры, возможно ли встретить такие координаты?

Сепидех Абадпур
источник

Ответы:

5

Не все текстуры используют координаты текстуры, которые берутся из данных меша. Например, при проективном текстурировании вы превращаете мир в пространство текстуры. Ну, большая часть этого мира находится за пределами [0, 1] диапазона текстуры. Без какого-либо режима зажима вы получите проблемы.

Николь Болас
источник
10

Точно, повторить текстуру.

Итак, если у вас есть квад, а координаты текстуры идут от 0 до 1, текстура будет нарисована один раз. Если координаты изменяются от 0 до 2, а обтекание установлено на GL_REPEAT, то текстура будет отрисована дважды.

Попробуйте и убедитесь сами

Панда Пижама
источник
хорошо, @Panda Pajama, поэтому для кода, подобного этому: float x0 = 0; // верхний левый угол изображения float y0 = 0; float x1 = x0 + ImageWidth; // нижний правый угол изображения float y1 = y0 + ImageHeight; glBegin (GL_TRIANGLE_STRIP Полоса); {glTexCoord2f (0, 1); glVertex2f (x0, y1); glTexCoord2f (0, 0); glVertex2f (x0, y0); glTexCoord2f (1, 1); glVertex2f (x1, y1); glTexCoord2f (1, 0); glVertex2f (x1, y0); } нет возможности встретить текстурные координаты за пределами интервала (0,1)?
Sepideh Abadpour
1
@sepideh: Конечно нет. Вы специально сохранили свои текстурные координаты в диапазоне [0, 1]. Что вы не понимаете, так это то, что вам не нужно ; Вы могли бы сделать их что угодно. Кроме того, не размещайте связку кода в комментариях. Если вы хотите получить разъяснения, отредактируйте свой вопрос.
Никол Болас
Хорошо, спасибо за ваше руководство по передаче кодов на мой вопрос. Я искал способ форматировать коды в командах, но не смог найти !!! Таким образом, вы имеете в виду, что встреча с такими координатами не является возможным событием во время выполнения. Это просто указывается программистом четко, чтобы повторять текстуру или нет.
Sepideh Abadpour
1
@sepideh Что означает "не возможное событие во время выполнения"? Это прекрасно, чтобы изменить свой код в комментарии, glTexCoord2f(0, 2);например. Это имеет очень четкое и четкое значение как в коде, так и во время работы программы. Если вы видите это, программист намеренно сделал это, потому что это дает желаемый результат.
Джозеф Мэнсфилд
2
@sepideh Конечно. OpenGL использует любые значения, которые вы ему даете. Если вы дадите ему значения в диапазоне от 0 до 1, вы больше ничего не получите.
Джозеф Мэнсфилд
5

Да, вы можете встретить координаты текстуры больше 1.0и меньше чем 0.0.

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

Это используется для повторения текстуры . Например, чтобы охватить времени текстуры четыре между четверного вершин, текстурные координаты бы 0,0, 0,4, 4,0и 4,4. Без текстуры упаковки, вам потребуются дополнительные вершины , чтобы разделить поверхность на 4 раза 4 вспомогательных поверхностей с каждой текстурных координат 0,0, 0,1, 1,0, 1,1. Меньшее количество вершин приводит к лучшей производительности рендеринга.

Обычно нежелательно, чтобы пользователь замечал края повторяющейся текстуры. Поэтому в большинстве случаев повторяющиеся текстуры являются мозаичными. Это означает, что правый край плавно переходит в левый, а верхний - в нижний. Таким образом, переход будет плавным и, надеюсь, не будет замечен пользователем.

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

Данияр
источник
Without texture wrapping, you would need additional vertices to split the surface into 4 times 4 sub surfaces with each the texture coordinates 0,0, 0,1, 1,0, 1,1Это настоящее практическое объяснение! Спасибо!
Амит Томар