OpenGL - wiele tekstur naraz, lode_png

OpenGL - wiele tekstur naraz, lode_png
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • 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.

edytowany 1x, ostatnio: Mikilll
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:11 minut
  • Postów:6675
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


🕹️⌨️🖥️🖱️🎮
MI
Dzięki za radę. Ale ja zasadzie nie rozumiem tego jeszcze tak dobrze i nie wiem, która część kodu jest dokładnie odpowiedzialna za ładowanie tekstury i jak można by taką funkcję wydzielić. Dla jednej tekstury mi działało. Nie rozumiem jak zrobić w OpenGL przełączanie pomiędzy różnymi teksturami.
Spine
Takich rzeczy nie pisze się w komentarzach...
mwl4
using namespace std; w nagłówku - proszenie się o kłopoty.
Spine
kłopoty to moja specjalność :]
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:41 minut
1
Kopiuj
glGenTextures(2, tex); //Zainicjuj jeden uchwyt

Nie kłam w komentarzach.

edytowany 1x, ostatnio: Azarien
MI
Masz rację. Na początku pisałem program, gdzie używałem jednej tekstury i działało. Teraz przerobiłem go, żeby żeby obsługiwał dwie tekstury i nie działa. Zapomniałem zmienić niekórych komentarzy.
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:11 minut
  • Postów:6675
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:prawie 11 lat
  • Ostatnio:około 5 lat
  • 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:około 22 lata
  • Ostatnio:11 minut
  • Postów:6675
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);

🕹️⌨️🖥️🖱️🎮
edytowany 3x, ostatnio: Spine
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • 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:prawie 11 lat
  • Ostatnio:około 5 lat
  • 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.

edytowany 1x, ostatnio: Mikilll

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.