pRoGraMerZ


Forum pRoGraMerZ Strona Główna -> OpenGL -> OpenGL pod Dev-Cpp - Podstawy Idź do strony 1, 2  Następny
Napisz nowy temat  Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat 
OpenGL pod Dev-Cpp - Podstawy
PostWysłany: Sob 16:04, 29 Paź 2005
freeman
Administrator

 
Dołączył: 20 Paź 2005
Posty: 9
Przeczytał: 0 tematów

Ostrzeżeń: 0/5





Opis uruchomienia środowiska OpenGL na kompilatorze Dev-Cpp i pierwsza aplikacja.

Witam wszystkich forumowiczów. W OpenGL podstawowymi bibliotekami są: gl.h oraz glu.h, wywołujące funkcje odpowiednio z opengl32.dll i glu32.dll. Rozszerzeniem OpenGL'a o nowe funkcje będzie biblioteka glut32.dll, do której mamy dostęp poprzez plik nagłówkowy glut.h (jest jeszcze konkurencyjna biblioteka glaux.h, ale nie będziemy z niej korzystać).
Po instalacji kompilatora kopiujemy biblioteki OpenGL (gl.h glu.h glut.h) do folderu Dev-Cpp\Include\GL\
Potem do Dev-Cpp\Lib\ kopiujemy biblioteki wykonawcze, z której kompilator będzie korzystał, czyli libopengl32.a libglu32.a libglut.a libglut32.a libglaux.a z biblioteki glaux nie będziemy korzystać na rzecz biblioteki glut.

I na koniec należy jeszcze zrzucić pliki opengl32.dll glu32.dll glut32.dll do windows\system32.

Po wykonaniu tych operacji przetępujemy do tworzenia pierwszego projektu w OpenGL. Uruchamiamy Dev'a i tworzymu nowy projekt.
Potem musimy ustawić opcje projektu, aby biblioteki były dołączane przy linkowaniu:
Projekt->opcje projektu->parametry W polu konsolidator wpisujemy (razem z minusami):
-lglut32
-lglu32
-lopengl32


Następnie po uprzednim skasowaniu kodu wygenerowanemu przez Dev-Cpp wpisujemy nasz kod:

#include <GL/gl.h>
#include <GL/glut.h>
#include <stdlib.h>

void Keyboard( unsigned char key, int x, int y)
{
if (key == 27) exit(EXIT_SUCCESS);
}

void Init()
{
glClearColor(0.2f, 0.2f, 0.4f, 1.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glutFullScreen();
glutKeyboardFunc(Keyboard);
}

void Render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f( 0.0f, 1.0f, 0.0f );
glutWireTeapot( 0.4 );
glutSwapBuffers();
}

int main(int argc, char **argv)
{
glutInitDisplayMode(GLUT_DOUBLE);
glutCreateWindow("Program_OpenGL");
Init();
glutDisplayFunc(Render);
glutMainLoop();
return EXIT_SUCCESS;
}


Zapisujemy projekt i wciskamy F9. Na ekranie powinien ukazać się dzbanek :]
P.S. Potrzebne biblioteki są na edysku. [link widoczny dla zalogowanych]
login: halflife2 hasło: freeman


Post został pochwalony 0 razy
Zobacz profil autora
PostWysłany: Sob 17:58, 29 Paź 2005
freeman
Administrator

 
Dołączył: 20 Paź 2005
Posty: 9
Przeczytał: 0 tematów

Ostrzeżeń: 0/5





Opis ważniejszych części kodu:

void Keyboard( unsigned char key, int x, int y)
{
if (key == 27) exit(EXIT_SUCCESS);
}


Funkcja keyboard służy do obsługi klawiatury. Na razie wprowadzona obsługa klawisza Esc, aby wyjść z programu.

void Init()
{
glClearColor(0.2f, 0.2f, 0.4f, 1.0f); // kolor tla
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); //bryła obcinania
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST); //test głebi
glutFullScreen(); //pełny ekran
glutKeyboardFunc(Keyboard); //rejestrowanie funkcji Keyboard
}

Funkcja Init odpowiedzialna jest za początkowe parametry okna renderowania. Kolejnosą tam polecenia, które ustawiają:
- kolor tła w formacie RGBA
- bryłę obcinana w rzutowaniu prostokątnym (trójwymiarowa bryła, w której efekty renderowania są widoczne; poza tym obszarem scena nie jest renderowana)
- test głebi (obiekty renderowane przysłaniają te dalsze)

Potem definiujemy główną funkcję renderującą:
void Render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f( 0.0f, 1.0f, 0.0f ); //ustawienie koloru (dzbanka)
glutWireTeapot( 0.4 ); //funkcja renderująca dzbanek (rozmiar)
glutSwapBuffers();
}

- funkcja glClear czyści ekran
- glutSwapBuffers() (jest ściśle związane z instrukcją glutInitDisplayMode(GLUT_DOUBLE);, która umożliwia ustawienie parametrów początkowych okna renderowania). Włącza ona podwójne buforowanie - rysujemy na "niewidocznym ekranie" (buforze), a po zakończeniu renderowania ekran staje się widoczny (ekran z pamięci (dane z bufora) ze wszystkimi narysowanymi obiektami jest wysyłany na monitor) Dzięki temu nie widać procesu renderingu (jak pojawiają się kolejne cześci dzbanka) tylko od razu cały dzbanek. Zamiany buforów dokonuje właśnie funkcja glutSwapBuffers.
W funkcji main też są komendy odpowiedzialne za tworzenie okna glutCreateWindow, wywołanie Init, rejestracja funkcji Render glutDisplayFunc(Render);. Funkcja glutMainLoop wprowadza program w nieskończoną pętlę zapobiegając wyjściu z programu.


Post został pochwalony 0 razy
Zobacz profil autora
PostWysłany: Sob 18:16, 29 Paź 2005
freeman
Administrator

 
Dołączył: 20 Paź 2005
Posty: 9
Przeczytał: 0 tematów

Ostrzeżeń: 0/5





No dobra, pora wprowadzić nieco ruchu do naszej sceny. W tym celu musimy stworzyć funkcję, która będzie wywoływana zawsze kiedy system nie będzie zajęty, umieszczamy ją zaraz przed main'em:

void Idle()
{
glRotatef( 0.1f, 1.0f, 1.0f, 1.0f); //wektor obrotu sceny
Render();
}


Trzeba jeszcze zarejestrować tą funkcję w main'ie:
glutIdleFunc(Idle);
Wstawiamy tą linijkę po Init(), a przed zarejestrowaniem funkcji Render.
main po zmianach powinien wygladać tak:
int main(int argc, char **argv)
{
glutInitDisplayMode(GLUT_DOUBLE);
glutCreateWindow("Program_OpenGL");
Init();
glutIdleFunc(Idle);
glutDisplayFunc(Render);
glutMainLoop();
return EXIT_SUCCESS;
}


Aha wartości wektorów, czy kolorów wprowadzamy za pomacą odpowiedniej reprezentacji liczb double w OpenGl np. 1.0f
Jeśli chcemy wyświetlić dodatkowo inne obiekty to odpowiednie instrukcje umieszczamy w funkcji Render()
glutWireSphere( 0.1, 30.0, 30.0)
glutWireCube(0.3)
glutWireCone( 0.04, 0.3, 20, 20);
glutWireTorus( 0.03, 0.1, 20, 20);

glVertex3f( 0.0f, 0.0f, 0.0f ) - tworzy wierzchołek w punkcie przestrzeni
Definicje wierzchołków umieszczamy w środku instrukcji glBegin:
glBegin( GL_POINTS );
glColor3f( 0.0f, 1.0f, 0.0f );
glVertex3f( 0.0f, 0.0f, 0.0f );
glColor3f( 0.0f, 0.0f, 1.0f );
glVertex3f( 0.5f, 0.0f, 0.0f );
glColor3f( 1.0f, 1.0f, 0.0f );
glVertex3f( 0.5f, 0.5f, 0.0f );
glColor3f( 1.0f, 0.0f, 0.0f );
glVertex3f( 0.0f, 0.5f, 0.0f );
glEnd();


Przed każdym wierzchołkiem możemy ustawić jego kolor funkcją glColor3f. Atrybut GL_POINTS w funkcji glBegin oznacza, że podajemy wierzchołki, z których każdy będzie punktem w przestrzeni. Inne atrybuty jakie możemy użyć to:GL_LINES GL_TRIANGLES (liczba wpisanych wierzchołków musi być wielokrotnością liczby 3) albo GL_QUADS (każde 4 wierzchołki to prostokąt)


Post został pochwalony 0 razy
Zobacz profil autora
PostWysłany: Sob 1:39, 10 Mar 2007
Birchwoodian
Zombie

 
Dołączył: 10 Mar 2007
Posty: 20
Przeczytał: 0 tematów

Ostrzeżeń: 0/5





Lindsay Lohan Doing A Hung Guy!
[link widoczny dla zalogowanych]


Post został pochwalony 0 razy
Zobacz profil autora
PostWysłany: Pią 23:53, 16 Mar 2007
Encejotard7
Poison Headcrab

 
Dołączył: 16 Mar 2007
Posty: 10
Przeczytał: 0 tematów

Ostrzeżeń: 0/5





Britney Spears Spreading Outdoors!
[link widoczny dla zalogowanych]


Post został pochwalony 0 razy
Zobacz profil autora
OpenGL pod Dev-Cpp - Podstawy
Forum pRoGraMerZ Strona Główna -> OpenGL
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Wszystkie czasy w strefie EET (Europa)  
Strona 1 z 2  
Idź do strony 1, 2  Następny
  
  
 Napisz nowy temat  Odpowiedz do tematu  


fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001-2003 phpBB Group
Theme created by Vjacheslav Trushkin
Regulamin