2010-10-06 19 views
5

Witam Jestem całkiem nowy w OpenGL.Powtarzanie tekstur w OpenGL

Moim zadaniem jest zaimplementowanie pędzli GDI w OpenGL do rysowania na systemie MAC OS X. W ten sposób zwróciłem się do tekstur w OpenGL, aby najpierw narysować wzór, a następnie to musi zostać odwzorowane na prymitywy rysunkowe, takie jak wielokąt (prostokąt i przykładem). Tworzę teksturę teksli 8x8, a następnie mapuję ją na wielokącie z współrzędnymi poniżej w oknie o wymiarach 500 x 500 pikseli.

glVertex3f (0,35, 0,35, 0,0);

glVertex3f (0,35, 0,65, 0,0);

glVertex3f (0,65, 0,65, 0,0);

glVertex3f (0,65, 0,35, 0,0);

Ponieważ potrzebuję efektu pędzla, wzór musi zostać powtórzony wzdłuż prostokąta. Prostokąt/kwadrat 0,3 x 0,3 i całego okna wynosi 500 x 500, a następnie w warunkach pikseli wielobok 150 x 150.

więc powtórzenia wymagane są 150/8

zatem ustawić tekstury jak współrzędne następująco:

glTexCoord2f(0.0,  0.0); glVertex3f(0.35, 0.35, 0.0); 
glTexCoord2f(0.0,  150/8); glVertex3f(0.35, 0.65, 0.0); 
glTexCoord2f(150/8,  150/8); glVertex3f(0.65, 0.65, 0.0); 
glTexCoord2f(150/8,  0.0); glVertex3f(0.65, 0.35, 0.0); 

mam wątpliwości, że kreskowanie pionowe (jeden Texel przejrzysty drugi kolorowy) wzór Stworzyłem jako tekstury nie jest odpowiednio odwzorowaną w tym sensie, że niektóre linie pionowe są coraz szersze niż inni (rodzaj problemu z aliasingiem). Czy to jest tak, że muszę ustawić współrzędne tekstury podczas mapowania?

Dzięki za wszelkie odpowiedzi

al

Odpowiedz

3

Jeśli kod napisałeś jest dokładnie to, co masz w kodzie, a następnie 150/8 jest twój problem. Jest to dzielenie całkowite i nie zwraca zmiennoprzecinkowego 18,75, ale liczbę całkowitą 18.

Zmień kod na wartości zmiennoprzecinkowe.

150.f/8.f 
14

Jeśli dobrze rozumiem cię, nie traktujesz poprawnie współrzędnych tekstury. Podczas korzystania z glTexCoord2f() tekstura rozciąga się od 0,0, 0,0 do 1,0, 1,0. Więc jeśli chcesz mieć konsystencję, która wypełnia quad użyć następującej:

glTexCoord2f(0.0f, 0.0f); glVertex3f(0.35f, 0.35f, 0.0f); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.35f, 0.65f, 0.0f); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.65f, 0.65f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.65f, 0.35f, 0.0f); 

A jeśli chcesz powtórzyć tekstury 8 razy po powierzchni wykorzystaniem quad 8.0f w miejsce 1.0fs w wywołanie texCoords. Musisz również upewnić się, że tekstura jest ustawiona na powtarzanie, gdy zostanie ustawiona po związaniu tekstury.

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

To chyba twój problem, ale jeśli nadal masz problemy aliasingu, spróbuj poszukać w glTexParameteri z GL_TEXTURE_MAG_FILTER i GL_TEXTURE_MAG_FILTER i MIP-mapping.

Może to być ponad dekada, ale numer this old Flipcode tutorial jest nadal aktualny i warty obejrzenia.

EDYTOWANIE: Mieć połączenia werteks przed wywołania texcoord

+0

Jak on nie traktuje poprawnie texcoordów? robi dokładnie to, co sugerujesz? I połączenia TexCoord przychodzą przed przerwaniami. – Bahbar

+0

Używa 150/8 zamiast 8. Dobry punkt o zamówieniu - nie korzystałem z trybu natychmiastowego od lat! – Pike65

+0

dziękuję Bahbar Właśnie zdałem sobie sprawę, co było problemem i zamierzał opublikować rozwiązanie. Tak, to był problem! W każdym razie dzięki – user461426