Что делает изменение GL_TEXTURE_WRAP) _ (S / T)?

12

Я работаю над некоторыми уроками OpenGL для начинающих, и в настоящее время я учу, как применить текстуру к простому прямоугольнику. Состояния учебника говорят мне, чтобы установить параметры текстуры GL_TEXTURE_WRAP_S и GL_TEXTURE_WRAP_T в GL_CLAMP_TO_EDGE, однако я не уверен относительно того, что это на самом деле делает. Я знаю, что это связано с тем, как обрабатываются текстуры больше / меньше, чем пространство, на которое они отображаются, но я не уверен, какое поведение это на самом деле вызывает. Что делает GL_CLAMP_TO_EDGE и чем это отличается от GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT? Большое спасибо заранее, и бонусная полезность, если вы можете предоставить изображения для идиота, как я.

w4etwetewtwet
источник

Ответы:

29

Ну и S и T просто означают U и V (или X и Y, если вы предпочитаете), или в GLSL:

vec4.xyzw == vec4.rgba == vec4.strq

В режиме GL_REPEAT текстуры повторяются при переходе от диапазона (0,0) к (1,1)

В режиме GL_CLAMP_TO_EDGE текстуры останавливаются на последнем пикселе, когда вы падаете с края.

GL_CLAMP и GL_CLAMP_TO_BORDER являются устаревшими, потому что все границы текстуры должны быть 0 пикселей, поэтому режимы больше не имеют смысла. (где-то около GL3 я верю)

Есть больше режимов, поэтому обязательно прочитайте документы. (Примеры: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


На http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml есть несколько хороших примеров , вот предварительный просмотр:

Wrap S: GL_CLAMP / Wrap T: GL_CLAMP

зажим зажим

Wrap S: GL_CLAMP / Wrap T: GL_REPEAT

зажим повторить

Wrap S: GL_REPEAT / Wrap T: GL_CLAMP

повторить зажим

Wrap S: GL_REPEAT / Wrap T: GL_REPEAT

повторить повторить

MickLH
источник
Спасибо. Отличный ответ. Знаете ли вы, есть ли какая-либо разница между GL_CLAMP_TO_EDGE и GL_CLAMP, и есть ли в любом случае просто заставить текстуру расширяться, чтобы заполнить доступное пространство?
w4etwetewtwet
Извините, что не разъяснил, где я говорю CLAMP, я имею в виду GL_CLAMP_TO_EDGE, GL_CLAMP ушел в современный OpenGL. Я отредактирую ответ, чтобы подчеркнуть это.
MickLH
Что касается «расширения», если вы просто имеете в виду растяжение текстуры в другой диапазон, это должно быть обработано во время параметризации сетки. (UV-картирование, работа художников). Если вам действительно нужно делать это прагматично, вам придется написать собственную формулу для использования в шейдере. (Или, я думаю, матрица GL_TEXTURE, если ваше приложение уже сильно устарело: P)
MickLH
4

Вот выдержка из справочной страницы OpenGL на glTexParameter по состоянию на 2014/02/07, отформатированная для удобства чтения:

GL_TEXTURE_WRAP_S

Устанавливает параметр обтекания для координаты текстуры s как GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT или GL_MIRROR_CLAMP_TO_EDGE.

  • GL_CLAMP_TO_EDGE вызывает привязку координат s к диапазонудиапазон , где N - размер текстуры в направлении зажима.

  • GL_CLAMP_TO_BORDER оценивает s координаты аналогично GL_CLAMP_TO_EDGE.
    Однако в тех случаях, когда в режиме GL_CLAMP_TO_EDGE произошло бы ограничение, извлеченные тексельные данные заменяются значениями, указанными в GL_TEXTURE_BORDER_COLOR.

  • GL_REPEAT вызывает целую часть с координаты ;
    GL использует только дробную часть, создавая тем самым повторяющийся узор.

  • GL_MIRRORED_REPEAT заставляет координату s быть установленной к дробной части координаты текстуры, если целая часть s четна ; если целая часть s нечетна, то координата текстуры s устанавливается равной 1-гидроразрыв, где гидроразрывапредставляет дробную часть s .

  • GL_MIRROR_CLAMP_TO_EDGE вызывает s- координаты, как для GL_MIRRORED_REPEAT для одного повторения текстуры, и в этот момент координата должна быть зафиксирована, как в GL_CLAMP_TO_EDGE.

Первоначально GL_TEXTURE_WRAP_S имеет значение GL_REPEAT .

WIP
источник