Dołączani niestandardowych bibliotek do kompilatora/Teksturowanie w OpenGL

0

Witam, nazywam się Dominik i jestem raczkującym programistą :)
Pracuję w tym momencie nad projektem na miejski konkurs(projekty wysyłać mogą tylko licealiści, którym jak się możecie teraz spodziewać jestem:) ), tworzę grę w Labirynt, wszystkie algorytmy właściwie działają mi bezproblemowo ale jest to jedno jedyne ale, które nie daje mi spać po nocach. Mianowicie bardzo zależy mi na oprawie graficznej programu (jest ona jedną ze składowych oceny projektu), potrafię utworzyć bardzo podstawowe okno używająć API windowsa, i wykorzystując podstawowe biblioteki OpenGl stworzyć podstawową grafikę. Problem jest w tym że chciałbym wykorzystać w grze tekstury w postaci załadowanych bitmap nałożonych na obiekty. Wszystkie poradniki wykorzystują w swoich kodach źródłowych dodatkową bibliotekę GLUT (nie wiem czy da się to zrobić standardowymi bibliotekami). Mam spory problem z poprawnym zainstalowaniem bibliotek i ich zalinkowaniem. Wyskakują mi następujące błedy

C:\Users\Domino\Desktop\C++\hardkor\MazeRunner\OpenGL\Nowy folder\main.o main.cpp:(.text+0x1c): undefined reference to _imp____glutInitWithExit@12' C:\Users\Domino\Desktop\C++\hardkor\MazeRunner\OpenGL\Nowy folder\main.o main.cpp:(.text+0x3e): undefined reference to _imp____glutCreateWindowWithExit@8'
C:\Users\Domino\Desktop\C++\hardkor\MazeRunner\OpenGL\Nowy folder\main.o main.cpp:(.text+0x60): undefined reference to _imp____glutCreateMenuWithExit@8' C:\Users\Domino\Desktop\C++\hardkor\MazeRunner\OpenGL\Nowy folder\main.o main.cpp:(.text+0x313): undefined reference to auxDIBImageLoadA@4'
C:\Users\Domino\Desktop\C++\hardkor\MazeRunner\OpenGL\Nowy folder\collect2.exe [Error] ld returned 1 exit status
C:\Users\Domino\Desktop\C++\hardkor\MazeRunner\OpenGL\Nowy folder\Makefile.win recipe for target 'Teksturowanie.exe' failed

Pragnę wspomnieć że z problemem borykam się już dwa tygodnie, prześledziłem wiele poradników polsko i angielskojęzycznych, próbowałem to zrobić na dwóch komputerach. Posiadam Dev C++ 5.11, wiem że wiele osób bardzo odradza jego używanie ale pracy w nim nauczyli mnie w szkole i chciałbym skończyć ten projekt na jednym IDE. Warto wspomnieć że najbardziej zależy mi na kompilatorze 32 bitowym (wymogi konkursu), ale byłbym uradowany gdyby biblioteki poprawnie działały mi zarówno na 32 jak i 64 bitowym kompilatorze. Mój kompilator to MinGW64. Wdzięczny byłbym gdyby okazało się że jest ktoś kto ma odrobinkę wolnego czasu i zechciał mi pomóc w tym wątku, albo skontaktować się ze mną przez skype, albo pw.
*W załączniku wysyłam jak na ten moment wygląda mój system wyświetlania Labiryntu.
*Nie wiem w jaki sposób powinienem wkleić błędy kompilatora/linkera, więc zwyczajnie przekopiowałem je tak jak pozostały tekst :P Powiedzcie mi jeśli powinienem był to zrobić w jakiś inny sposób :)

0

Dev C++ > 4.9.9.2 jest ok.

Musisz do projektu dodać plik *.a biblioteki glut.

Skoro tylko chcesz ładować tekstury, to jednak polecałbym zamiast gluta skorzystać z minimalistycznej "biblioteki" picopng: http://lodev.org/lodepng/picopng.cpp
która działa bez dodatkowych dll'ek czy libów (*.lib, *.a).

Masz tutaj przykład użycia z OpenGL z mojego starego projektu:
http://ideone.com/KYrJ48
http://ideone.com/8ZOV94

Możesz tym ładować pliki *.png z kanałem alpha ;)

  1. Tworzysz nowy obiekt tekstury (tekstura = new Texture();)
  2. Wywołujesz metodę Load (tekstura->Load("nazwa_pliku.png", true);).
  3. Używasz identyfikatora tekstury (tekstura->texID) w funkcji glBindTexture.
0

Spróbowałem zrobić to tak jak mi poleciłeś, napotkałem jednak parę problemów. Mianowicie tekstura = new Texture(); zwracała mi błąd więc zadeklarowałem obiekt w ten sposób

Texture tekstura; 

Operatory -> zamieniłem na kropki, ponieważ -> zwracały mi błąd.
Wszystko teoretycznie działa (to znaczy kompiluje się i nie zwraca błędu), ale próba wyświetlenia tekstury nic nie daje. Oto w jaki sposób próbowałem(nieudolnie ale wciąż) wyświetlić teksture. Plik .png mam oczywiście w tym samym folderze co projekt.

void Rysuj(float startowy_x, float startowy_y)
{
	glBindTexture (GL_TEXTURE_2D, tekstura.texID);
	glEnable(GL_TEXTURE_2D);
    glPushMatrix ();
    //glRotatef ( 0.0, 0.0f, 0.0f, 1.0f);
    //glMatrixMode(GL_MODELVIEW);
	glTranslatef( 0.1, 0.0, 0.0 );
	glBegin (GL_QUADS);
	
	glTexCoord2f (0.0, 0.0);
	//glColor3f(5.0f, 0.0f, 0.0f);
	glVertex3f (startowy_x+x, startowy_y+y, 0.0);
	
	glTexCoord2f (1.0, 0.0);
	//glColor3f(1.0f, 1.0f, 0.0f);
	glVertex3f (startowy_x+(rozmiar*WinHeight/WinWidth)+x, startowy_y+y, 0.0);
	
	//glColor3f(1.0f, 6.0f, 0.0f);
	glTexCoord2f (0.0, 0.0);
	glVertex3f (startowy_x+(rozmiar*WinHeight/WinWidth)+x, startowy_y-rozmiar+y, 0.0);
	
	//glColor3f(1.0f, 1.0f, 0.01f);
	glTexCoord2f (1.0, 0.0);
	glVertex3f (startowy_x+x, startowy_y-rozmiar+y, 0.0);

	glEnd ();
	glDisable(GL_TEXTURE_2D);
    glPopMatrix ();
} 

Wyświetlane kwadraty nie zawierają żadnej tekstury, są zwyczajnie białe.

1
Gery napisał(a):

Spróbowałem zrobić to tak jak mi poleciłeś, napotkałem jednak parę problemów. Mianowicie tekstura = new Texture(); zwracała mi błąd więc zadeklarowałem obiekt w ten sposób

Texture tekstura; 

Operatory -> zamieniłem na kropki, ponieważ -> zwracały mi błąd.

Z operatorem new musiałbyś zadeklarować teksturę w ten sposób: Texture *tekstura;
W którym momencie wywołujesz metodę Load? Powinieneś to zrobić po zainicjowaniu/uzyskaniu kontekstu OpenGL.

Rysowanie wygląda ok.

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