Co robi zmiana GL_TEXTURE_WRAP) _ (S / T)?

12

Pracuję nad kilkoma samouczkami OpenGL dla początkujących, a bieżący uczy, jak nakładać teksturę na prosty prostokąt. Stan samouczka mówi mi, aby ustawić parametry tekstury GL_TEXTURE_WRAP_S i GL_TEXTURE_WRAP_T na GL_CLAMP_TO_EDGE, jednak nie jestem pewien, co to właściwie robi. Wiem, że ma to związek z tym, jak obsługiwane są tekstury większe / mniejsze niż przestrzeń, na którą są mapowane, ale nie jestem pewien, jakie zachowanie to powoduje. Co robi GL_CLAMP_TO_EDGE i czym różni się od GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT? Z góry dziękuję i dodatkowa pomoc, jeśli możesz dostarczyć obrazy dla takiego idioty jak ja.

w4etwetewtwet
źródło

Odpowiedzi:

29

Cóż, S i T oznaczają po prostu U i V (lub X i Y, jeśli wolisz) lub w GLSL:

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

W trybie GL_REPEAT powtarzane są tekstury po przekroczeniu zakresu (0,0) do (1,1)

Tryb GL_CLAMP_TO_EDGE ma tekstury zatrzymujące się na ostatnim pikselu, gdy spadniesz z krawędzi.

GL_CLAMP i GL_CLAMP_TO_BORDER są amortyzowane, ponieważ wszystkie ramki tekstur muszą mieć 0 pikseli, więc tryby nie mają już sensu. (gdzieś w okolicy GL3)

Dostępnych jest więcej trybów, więc przeczytaj dokumenty. (Przykłady: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


Istnieje kilka dobrych przykładów na http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml , oto podgląd:

Zawiń S: GL_CLAMP / Zawiń T: GL_CLAMP

zacisk zacisk

Zawiń S: GL_CLAMP / Zawiń T: GL_REPEAT

powtórz klamrę

Zawiń S: GL_REPEAT / Zawiń T: GL_CLAMP

powtórz zacisk

Zawiń S: GL_REPEAT / Zawiń T: GL_REPEAT

powtórz powtórz

MickLH
źródło
Dzięki. Świetna odpowiedź. Czy wiesz, czy istnieje jakakolwiek różnica między GL_CLAMP_TO_EDGE i GL_CLAMP, i czy w ogóle istnieje możliwość powiększenia tekstury w celu wypełnienia dostępnej przestrzeni?
w4etwetewtwet
Przepraszam, że nie wyjaśniłem, gdzie mówię CLAMP, mam na myśli GL_CLAMP_TO_EDGE, GL_CLAMP zniknął w nowoczesnym OpenGL. Przeredaguję odpowiedź, aby to podkreślić.
MickLH
Jeśli chodzi o „rozszerzanie”, jeśli chodzi o rozciąganie tekstury w innym zakresie, należy to zrobić podczas parametryzacji siatki. (Mapowanie UV, praca artystów) .. Jeśli naprawdę musisz to zrobić pragmatycznie, musisz napisać własną formułę do użycia w module cieniującym. (Lub zgaduję, że macierz GL_TEXTURE, jeśli twoja aplikacja jest już poważnie przestarzała: P)
MickLH
4

Oto fragment strony z OpenGL Reference na glTexParameter z 2014/02/07, sformatowany nieco dla łatwiejszego czytania:

GL_TEXTURE_WRAP_S

Ustawia parametr zawijania dla współrzędnych tekstury s na GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT lub GL_MIRROR_CLAMP_TO_EDGE.

  • GL_CLAMP_TO_EDGE powoduje zaciśnięcie współrzędnych s do zakresu zasięg, gdzie N jest rozmiarem tekstury w kierunku zaciśnięcia.

  • GL_CLAMP_TO_BORDER ocenia współrzędne s w podobny sposób jak GL_CLAMP_TO_EDGE.
    Jednak w przypadkach, w których wystąpiłoby blokowanie w trybie GL_CLAMP_TO_EDGE, pobrane dane tekstowe są zastępowane wartościami określonymi przez GL_TEXTURE_BORDER_COLOR.

  • GL_REPEAT powoduje, że część całkowita współrzędnej s jest ignorowana;
    GL używa tylko części ułamkowej, tworząc w ten sposób powtarzalny wzór.

  • GL_MIRRORED_REPEAT powoduje ustawienie współrzędnej s na ułamkową część współrzędnej tekstury, jeśli liczba całkowita s jest parzysta; jeśli liczba całkowita s jest nieparzysta, wówczas współrzędna tekstury s jest ustawiona na 1-frac, gdzie fracreprezentuje część ułamkową s .

  • GL_MIRROR_CLAMP_TO_EDGE powoduje, że współrzędna s jest powtarzana jak dla GL_MIRRORED_REPEAT dla jednego powtórzenia tekstury, w którym to punkcie współrzędna ma zostać zaciśnięta jak w GL_CLAMP_TO_EDGE.

Początkowo GL_TEXTURE_WRAP_S jest ustawiony na GL_REPEAT .

wycierać
źródło