Що робить зміна 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? Заздалегідь дякую, і бонусна допомога, якщо ви можете надати зображення для такого ідіотця, як я.

Відповіді:


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 є кілька хороших прикладів , ось попередній перегляд:

Оберніть S: GL_CLAMP / Оберніть T: GL_CLAMP

затискач затискач

Оберніть S: GL_CLAMP / Оберніть T: GL_REPEAT

затиск повторити

Оберніть S: GL_REPEAT / Оберніть T: GL_CLAMP

повторний затискач

Оберніть S: GL_REPEAT / Оберніть T: GL_REPEAT

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


Дякую. Чудова відповідь. Чи знаєте ви, чи є різниця між GL_CLAMP_TO_EDGE та GL_CLAMP, і якщо все-таки є просто отримати текстуру для розширення, щоб заповнити наявний простір?
w4etwetewtwet

Вибачте, що не уточнив, де я кажу CLAMP, я маю на увазі GL_CLAMP_TO_EDGE, GL_CLAMP відсутній у сучасному OpenGL. Я відредагую відповідь, щоб наголосити на цьому.
MickLH

Що стосується "розширення", якщо ви просто маєте на увазі розтягнення текстури в інший діапазон, з цим слід оброблятись під час параметризації сітки. (УФ-картографування, робота художників) .. Якщо ви дійсно повинні це зробити прагматично, то вам доведеться написати власну формулу для використання в шейдері. (Або я думаю, матриця 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 змушує ігнорувати цілу частину координати s ;
    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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.