Grafika komputerowa
Czym jest OpenGL ?
OpenGL(Open Graphics Library) jest biblioteką graficzną
służącą do generowania w czasie rzeczywistym grafiki
trójwymiarowej.
W skład biblioteki wchodzi kilkaset funkcji udostępniających
możliwość
wykorzystania
sprzętu
do
generowania
trójwymiarowych obrazów.
Materiały o OpenGL
http://nehe.gamedev.net/
Andrzej
Orłowski
OpenGL działa w architekturze klient – serwer.
Klientem jest aplikacja wykorzystująca OpenGL, która zleca
operacje graficzne do wykonania, a serwerem aktualnie używana
implementacja OpenGL (np. w sterowniku karty graficznej).
Opis działania
Budowa sceny odbywa się przez zapisywanie kolejnych kroków
koniecznych do jej odtworzenia. Każdy krok to wywołanie
odpowiedniej funkcji biblioteki.
GLU (GL Utility library) : umożliwia łatwe tworzenie często używanych
brył – kula, stożek, widoków perspektywicznych, kamery
Biblioteki pomocnicze
GLUT (GL Utility Toolkit) : umożliwia tworzenie i zarządzanie
oknami, monitorowanie myszy i klawiatury, rysowanie
podstawowych brył geometrycznych
Tworzenie pierwotnych obiektów graficznych (tzw. prymitywów)
na scenie graficznej odbywa się w standardzie OpenGL za
pomocą poleceń o ujednoliconej strukturze. Rodzaj tworzonego
obiektu określa się za pomocą parametrów wywołania funkcji
glBegin(). Wraz ze swoim odpowiednikiem, glEnd(), tworzy ona
swoiste „nawiasy” obejmujące całość procedury rysowania
obiektu.
Struktura polecenia OpenGL:
Większość poleceń OpenGL jest ponadto niezależna od rodzaju
obiektu docelowego, co oznacza, że efekt ich użycia względem
dowolnego obiektu będzie zawsze taki sam.
Przykład: glColor3f(0.5, 0.5, 0.5)
Etapy tworzenia grafiki
Inicjalizacja podsystemu OpenGL
Przygotowanie środowiska do utworzenia obiektów
Zdefiniowanie procesów transformacji obiektów
pierwotnych
Generowanie obiektów pierwotnych
Wymiana powierzchni - tylko dla operacji
wykorzystujących podwójne buforowanie
przygotowania środowiska operacyjnego do wywołań funkcji OpenGL
Inicjalizacja podsystemu
OpenGL
procedure setupPixelFormat(DC:HDC);
const
pfd:TPIXELFORMATDESCRIPTOR = (
…
);
var pixelFormat:integer;
begin
pixelFormat := ChoosePixelFormat(DC, @pfd);
if (pixelFormat = 0) then begin
exit;
end;
if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE)
then begin
exit;
end;
end;
określenie widoków
Inicjalizacja podsystemu
OpenGL
glViewport(x, y, w, h :
integer);
x i y- definiuje położenie lewego
dolnego
wierzchołka okna widoku
w - definiuje szerokość okna
h - definiuje wysokość okna
rzutowanie
Inicjalizacja podsystemu
OpenGL
glOrtho(left, right, bottom, top, near,
far : GLfloat);
left - określa współrzędne x lewej płaszczyzny
obcinania
right - określa współrzędne x prawej płaszczyzny
obcinania,
bottom - określa współrzędne y dolnej płaszczyzny
obcinania,
top - określa współrzędne y górnej płaszczyzny
obcinania,
near - określa współrzędne przedniej płaszczyzny
obcinania,
far - określa współrzędne tylnej płaszczyzny
obcinania,
rzutowanie
Inicjalizacja podsystemu
OpenGL
gluPerspective (fov, aspect, near, far :
GLfloat);
fov - określa kąt widzenia, czyli rozwartość ostrosłupa
ograniczającego widoczny wycinek sceny,
aspect - wyznacza proporcję szerokości przekroju
ostrosłupa do jego wysokości,
near - określa współrzędne z przedniej płaszczyzny
obcinania,
far - określa współrzędne z tylnej płaszczyzny obcinania,
Inicjalizacja podsystemu
OpenGL
procedure GLInit;
begin
glViewport(0,0,400,400);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(-200,200,-200,200,-
200,200);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;
procedure TForm1.FormCreate(Sender:
TObject);
var
DC:HDC;
RC:HGLRC;
i:integer;
begin
DC:=GetDC(Panel1.Handle);
SetupPixelFormat(DC);
RC:=wglCreateContext(DC);
wglMakeCurrent(DC, RC);
GLInit;
end;
światło
Przygotowanie
środowiska ...
Przygotowanie środowiska ...
glLight*(Numer_Lampy, Właściwość : enum, Wsk_Kolorów :
GLfloat);
Wartości parametru Właściwość:
GL_AMBIENT – światło rozproszone
GL_POSITION – pozycja źródła światła
GL_SPECULAR – światło odbite
W celu utworzenia efektu światła
należy:
wywołać procedurę glEnable(GL_LIGHTING)
włączyć jedną z kilku lamp przy pomocy procedury
glEnable(GL_LIGHT0). Parametrem procedury może być jedna z
wartości GL_LIGHT0 do GL_LIGHT7
wywołać procedury odpowiedzialne za poszczególne typy
oświetlenia
światło
Przygotowanie
środowiska ...
var
amb : TGLArrayf4 = (0.2,0.3,0.0,0.0);
pos : TGLArrayf4 = (-100,100,0.0,0.0);
procedure TForm1.FormCreate(Sender: TObject);
var
DC:HDC;
RC:HGLRC;
i:integer;
begin
DC:=GetDC(Panel1.Handle);
SetupPixelFormat(DC);
RC:=wglCreateContext(DC);
wglMakeCurrent(DC, RC);
GLInit;
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0,GL_Ambient, @amb);
glLightfv(GL_LIGHT0,GL_Position, @pos);
end;
światło
materiał
Przygotowanie środowiska ...
GlMaterialfv(Strona, Właściwość : Glenum, Wskaźnik_Kolorów
: PGLInt);
GlMaterialf(Strona, Właściwość : Glenum, Wskaźnik_Kolorów :
GLFloat); Wartości parametru Właściwość:
GL_AMBIENT – kolor w świetle
otoczenia
GL_DIFFUSE – kolor w świetle
rozproszonym
GL_SHININESS – współczynnik odbicia
Wartości parametru
Strona:
GL_FRONT
GL_BACK
GL_FRONT_AND_BACK
Var
mat_ambient : array [0..3] of GLfloat = ( 1.0,
1.0, 1.0, 1.0 );
...
glMaterialfv(GL_FRONT, GL_AMBIENT,
@mat_ambient);
Transformacje ...
Przesunięcie:
glTranslatef (x, y, z : gldouble);
x, y z określają współrzędne wektora
przesunięcia
Obrót:
Skalowanie:
glRotatef(kąt, x, y, z : glfloat);
x, y, z określają współrzędne wektora osi
glScalef(x, y, z : glfloat);
x, y z określają wartości powiększenia wzdłuż
poszczególnych osi
Generowanie obiektów
Zestaw instrukcji rysujących
prostokąt:
glBegin( GL_QUADS);
glVertex3f( -30, 0, 0.0);
glVertex3f( 0, -30, 0.0);
glVertex3f( 30, 0, 0.0);
glVertex3f( 0, 30, 0.0);
glEnd();
Generowanie obiektów
Generowanie obiektów
Generowanie obiektów
Generowanie obiektów
Wymiana powierzchni
Ostatni etap składa się tylko z jednej funkcji SwapBuffers() i dotyczy
tylko operacji wykorzystujących podwójne buforowanie.
Przykłady programów ...