Dlaczego można spotkać współrzędną tekstury większą niż 1 lub mniejszą niż 0

11

Studiuję tekst texture mappingi na preparing to drawsesji czytam:

Zdefiniuj parametry zawijania tekstur. To kontroluje, co się stanie, gdy zostanie napotkana współrzędna tekstury większa niż 1,0 lub mniejsza niż 0,0:

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

gdzie wrap jest:
GL_REPEAT: określa, że ​​ten wzór będzie się powtarzał (tj. zawijać), jeśli napotkane zostaną przekształcone współrzędne tekstury mniejsze niż 0,0 lub większe niż 1,0.

GL_CLAMP: określa, że ​​wzór będzie „przyklejał się” do wartości przy 0,0 lub 1,0.

Ale nie ma wyjaśnienia, z jakiego powodu występują takie współrzędne tekstury?
Załóżmy na przykład, że właśnie narysowałem prostokąt i chcę zastosować na nim obraz jako teksturę, czy można spotkać takie współrzędne?

Sepideh Abadpour
źródło

Odpowiedzi:

5

Nie wszystkie tekstury używają współrzędnych tekstury pochodzących z danych siatki. Na przykład teksturowanie rzutowe przekształca świat w przestrzeń tekstury. Cóż, duża część tego świata nie mieści się w zakresie [0, 1] tekstury. Bez jakiegoś rodzaju trybu zaciskania będziesz mieć problemy.

Nicol Bolas
źródło
10

Dokładnie, aby powtórzyć teksturę.

Tak więc, jeśli masz kwadrat, a współrzędne tekstury wynoszą od 0 do 1, tekstura zostanie narysowana raz. Jeśli współrzędne GL_REPEATzmienią się od 0 do 2, a zawijanie zostanie ustawione na , wówczas tekstura zostanie narysowana dwukrotnie.

Wypróbuj i przekonaj się sam

Panda Piżama
źródło
ok @ Panda Piżama, więc dla takiego kodu: float x0 = 0; // lewy górny róg obrazu float y0 = 0; float x1 = x0 + ImageWidth; // prawy dolny róg obrazu 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); } nie ma możliwości napotkania współrzędnych tekstury poza przedziałem (0,1)?
Sepideh Abadpour
1
@sepideh: Oczywiście, że nie. W szczególności utrzymałeś swoje współrzędne tekstury w zakresie [0, 1]. To, czego nie rozumiesz, to to, że nie musisz ; mogłeś zrobić wszystko. Nie publikuj też wielu kodów w komentarzach. Jeśli chcesz wyjaśnienia, edytuj swoje pytanie.
Nicol Bolas
ok dziękuję za wskazówki dotyczące przekazywania kodów do mojego pytania. Szukałem sposobu formatowania kodów w poleceniach, ale nie mogłem znaleźć !!! Masz na myśli, że spotkanie takich współrzędnych nie jest wydarzeniem możliwym w czasie wykonywania. Jest to po prostu wyraźnie określone przez programistę, aby powtórzyć teksturę lub nie.
Sepideh Abadpour
1
@sepideh Co oznacza „nie możliwe zdarzenie w czasie wykonywania”? Na przykład dobrze jest zmienić kod w komentarzu, aby glTexCoord2f(0, 2);na przykład. Ma to bardzo ściśle określone znaczenie zarówno w kodzie, jak i podczas działania programu. Jeśli to zobaczysz, programista celowo to zrobił, ponieważ daje pożądany rezultat.
Joseph Mansfield
2
@sepideh Oczywiście. OpenGL korzysta z podanych przez Ciebie wartości. Jeśli podasz wartości z zakresu od 0 do 1, nigdy nie dostaniesz nic innego.
Joseph Mansfield
5

Tak, możesz napotkać współrzędne tekstury większe 1.0lub mniejsze niż 0.0.

Zależy to całkowicie od załadowanego modelu. Zwykle dla każdego wierzchołka jest przechowywana współrzędna położenia, normalna i tekstury. W większości formatów plików siatki współrzędna tekstury nie jest ograniczona do żadnego zakresu.

Służy do powtarzania tekstury . Na przykład, aby rozciągać się tekstura cztery razy pomiędzy quad wierzchołków współrzędne struktura będzie 0,0, 0,4, 4,0i 4,4. Tekstury bez zawijania, że potrzebne są dodatkowe wierzchołki podzielić powierzchnię na 4 razy 4 powierzchnie sub ze sobą współrzędnych tekstur 0,0, 0,1, 1,0, 1,1. Mniej wierzchołków powoduje lepszą wydajność renderowania.

Zazwyczaj nie jest pożądane, aby użytkownik zauważył krawędzie powtarzającej się tekstury. Dlatego w większości przypadków powtarzające się tekstury można kafelkować. Niż oznacza, że ​​prawa krawędź płynnie zanika do lewej, a górna krawędź do dolnej. W ten sposób przejście jest płynne i miejmy nadzieję, że użytkownik nie zauważy tego.

Bardziej zaawansowanym, ale pokrewnym tematem jest sprytne zaciemnienie faktu, że ta sama tekstura została powtórzona wiele razy. Na przykład mieszanie powtarzających się tekstur o różnych rozmiarach, na przykład tekstury ścian i kalkomanii brudu, jest powszechną techniką.

danijar
źródło
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,1To jest pewne praktyczne wyjaśnienie! Dzięki!
Amit Tomar