OpenGL - wiele tekstur naraz, lode_png

OpenGL - wiele tekstur naraz, lode_png
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 243
0

92b1f6c931.png

0c45e4e273.png

62e6fc3e5f.png

Mam tu fragment prostego programu rysującego dwa sześciany w dwóch różnych miejscach. Chciałbym, aby każdy z nich miał inną teksturę. Niestety nie wychodzi mi to. Zamiast tego jeden z nich jest czarny, a drugi biały. Dodam, że jak pisałem wcześniej program i używałem jednej tekstury to wszystko działało, ale dwóch tekstur już nie umiem obsłużyć. W czym może tkwić błąd?

Do wczytania tekstur używam biblioteki lodepng.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6965
1

Wydziel sobie funkcję ładującą teksturę do odrębnej funkcji, zamiast mieszać wszystko.

Może pomoże Ci moja klasa do ładowania tekstur wykorzystująca picopng (lodepng przerobione na jedną funkcję).

http://ideone.com/8ZOV94

http://ideone.com/KYrJ48

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
glGenTextures(2, tex); //Zainicjuj jeden uchwyt

Nie kłam w komentarzach.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6965
1

Mój kod dołącz do projektu i robisz tak:

  1. Dopisz na górze #include "texture.h"
  2. Deklarujesz zmienne poza funkcją:
Kopiuj
Texture tex1, tex2;
  1. Tworzysz nowy obiekt tekstury (tekstura = new Texture();), najlepiej na końcu funkcji initOpenGLProgram.
  2. Wywołujesz metodę Load (tekstura.Load("nazwa_pliku.png", true);).
  3. Używasz identyfikatora tekstury (tekstura.texID) w funkcji glBindTexture przed narysowaniem obiektu, czyli w Twoim przypadku podajesz tekstura.texID jako ostatni parametr funkcji DrawCube.
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 243
0

Zrobiłem tak jak chciał Spine i to działa. Są 2 tekstury. Tylko nie wiem dlaczego, ale aplikacja teraz strasznie muli i nie reaguje na polecenia uzytkownika, np. strzalki w lewo i prawo u mnie obracały kostki, a teraz nic sie nie dzieje. Zobaczcie sobie.

PS: Wybaczcie za to że nie wrzucam zdjęcia, ale to by było bez sensu bo tam troche kodu jest.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6965
1

Ładujesz teksturę co klatkę...

Kopiuj
	tekstura.Load("bricks.png",true);
	DrawCube(M,V,0,0,0,tekstura.texID);
	tekstura.Load("texture.png", true);
	DrawCube(M, V, -1.5, 0, 0,tekstura.texID);

To bardzo dużo operacji, co klatkę dekodować png...

Powinieneś tekstury ładować w innym miejscu (tak jak pisałem, w funkcji initOpenGLProgram, bo jest ona wywoływana tylko raz, przed główną pętlą), a przy rysowaniu powinieneś wykorzystywać tylko tekstura.texID. Także...

  1. Widzę, że zadeklarowałeś tex1, tex2, ale ich nie użyłeś...
  2. Więc użyj ich w funkcji initOpenGLProgram, czyli na końcu funkcji dopisz:
Kopiuj
tex1.Load("bricks.png",true);
tex2.Load("texture.png",true);
  1. Tam gdzie rysujesz sześciany, wywal linijki tekstura.Load, i napisz samo:
Kopiuj
	DrawCube(M,V,0,0,0,tex1.texID);
	DrawCube(M, V, -1.5, 0, 0,tex2.texID);
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 243
0

Dzięki bardzo w kit za zaangażowanie! Teraz działa. Reaguje na ruchy użytkownika, ale uruchomienie aplikacja nadal trwa bardzo długo, a przecież wczytujemy tylko dwa sześciany. Jak wczytywałem jedną teksturę bez tej twojej klasy to robiło się to natychmiast, a tu widzę, że jest kłopot z wydajnością.

MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 243
0

b7abaaf0f1.png

b77f407750.png

58bd14f845.png

(wszystkie powyższe screeny pochodzą z jednego pliku main_file.cpp

A może jednak ktoś pomoże, dlaczego nie działa mój sposób wczytywania dwóch tekstur? Byłbym bardzo wdzięczny.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.