Ładowanie prostokątnych tekstur

0

Witam,

Muszę w swoim programie zaimplementować ładowanie tekstur prostokątnych. No i szukałem o tym na google, i znalazłem stałą GL_TEXTURE_RECTANGLE. Problem leży jednak w tym cytacie:

In the days before non-power-of-two textures were available, rectangle textures were the only way to have textures with irregular sizes. This was particularly useful for render targets, which often were intended to be screen-sized images.

From a modern perspective, they seem essentially useless. But even now, they do have some small purpose.

Źródło: http://www.opengl.org/wiki/Rectangle_Texture

Podobno też nie są one normalizowane (wyczytałem w książce).

Wynika z niego, że w dzisiejszych czasach używanie tej stałej nie jest najlepszym pomysłem. Więc prosiłbym o poradę, jakie to rozwiązanie jest na chwilę obecną polecane do teksturowania obiektów 3D i jest obsługiwane przez większość kart graficznych?

0

@neonek911, niestety nie mam żadnego wpływu na rozmiary tekstur. To będzie program wyświetlający różnorakie pliki przygotowane w blenderze/innym, typu 3ds max. Ma ktoś inny pomysł?

0

Wczytać do pamięci i rozszerzyć wymiary do potęgi dwójki z alpha == 0 – tak nie można?

0

Ale to jest przecież bezsensowna strata pamięci (wyobraź sobie obrazek, hmm, np. 13x513) i na dodatek mnóstwo niepotrzebnej zabawy... Nie ma jakiejś stałej/funkcji pomocnej w tym wypadku?

0

@Azarien:
"Napisz sobie". Ładnie brzmi, i najprościej jest takiej odpowiedzi udzielić. Problem nie leży we wczytywaniu obrazka - z tym nie mam problemu. Problem jest w użyciu funkcji glTexImage2D, ponieważ użycie GL_TEXTURE_2D powoduje wywalenie programu przy niekwadratowych teksturach, a użycie GL_TEXTURE_RECTANGLE powoduje brak mipmappingu (akurat najmniejszy problem) i normalizowania, czyli zamiany współrzędnych na zakres 0...1. Mam sobie napisać funkcję zastępującą ładowanie tekstur? Fajnie, tylko nie mam pojęcia jak to zrobić... Jakiś link mógłbyś podać? Kurczę, nie wierzę, że nie ma innej możliwości...

0

Możesz sobie wczytać rozmiar tekstury, sprowadzić rozmiary do potęgi dwójki, zaalokować i wypełnić bufor przezroczystością (nieprzezroczystością) i wczytać tam obrazek. Później operujesz texcoordami tak, żeby pominąć dodatki.

0

@MainName
Obczaj sobie ten wątek:
http://www.gamedev.net/topic/411029-using-glteximage2d/
Jeśli dobrze zrozumiałem problem rozwiązuje odpowiednie użycie gluBuild2DMipmaps.

0

@yurai, mówił Ci ktoś wcześniej, że jesteś geniuszem? :P

Dla potomnych - należy się zastosować do 2 posta w tym linku który podał @yurai (http://www.gamedev.net/topic/411029-using-glteximage2d/), tylko zastąpić stałą GL_TEXTURE_2D na GL_TEXTURE_RECTANGLE:

gluBuild2DMipmaps( GL_TEXTURE_RECTANGLE, GL_RGBA, width, height, format, type, pixels );

oraz nie zapomnieć aktywować (glEnable) teksturowania prostokątnego:

glEnable(GL_TEXTURE_RECTANGLE);

Jeszcze raz dzięki :)

0

Hmm, jeszcze mam takie jedno małe pytanko... Jak już pisałem wcześniej, tekstury prostokątne nie są poddawane normalizacji, co skutkuje przymusem korzystania z współrzędnych obrazu. No i w tym jest problem - mianowicie, utworzyłem sobie prosty plik .tga i nakładam go jako teksturę na prostokąt. I wszystko fajnie, tylko nie zgadzają mi się współrzędne... Musiałem użyć tego kodu, aby tekstura wyglądała prawidłowo i nie była przycięta lub ściśnięta:

   glTexCoord2f(0, 0);
   glVertex3f(-1, 0.1, -2);
   glTexCoord2f(250, 0);
   glVertex3f(1, 0.1, -2);
   glTexCoord2f(250, 150);
   glVertex3f(1, 1.1, -2);
   glTexCoord2f(0, 150);
   glVertex3f(-1, 1.1, -2);

Podczas gdy plik .tga ma wymiary 200x100. W jaki sposób obliczyć jakich współrzędnych powinniśmy użyć w OpenGL'u, dla obrazka np. 400x250?

0

glTexCoord2f(0, 150); - to powinno zadziałać, ale (o ile mnie pamięć nie myli) to ta metoda przyjmuje pozycję tekstury w znormalizowanych współrzędnych tzn. 1 na x to będzie szerokość tekstury 1 na y to jej wysokość.

glTexCoord2f(0, 0);
glVertex3f(-1, 0.1, -2);
glTexCoord2f(1, 0);
glVertex3f(1, 0.1, -2);
glTexCoord2f(1, 1);
glVertex3f(1, 1.1, -2);
glTexCoord2f(0, 1);
glVertex3f(-1, 1.1, -2);

Powinno zadziałać (nie bijcie jeżeli nie bo piszę z głowy a nie chce mi się sprawdzać).

0
maze napisał(a):

ta metoda przyjmuje pozycję tekstury w znormalizowanych współrzędnych

Ale właśnie użycie tekstury prostokątnej powoduje że należy użyć współrzędnych nienormalizowanych, i tylko takie działają. Pytanie brzmi: Dlaczego współrzędne, których trzeba użyć są inne od wymiarów obrazka?

0

zamasit glTexCoord2f spróbuj użyć glTexCoord2i

0

Nic to nie zmienia. Zresztą, czemu miałoby, skoro float może przechowywać wartości całkowite? Tak więc pytanie nadal aktualne :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1