background image

Laboratorium nr 3 

1/5 

 

1) 

Rysowanie prymitywów 

 

Podstawową rodziną funkcji wykorzystywanych w bibliotece OpenGL do rysowania 

różnego  rodzaju  prymitywów  (punktów,  odcinków,  wielokątów)  jest  glVertex.  Funkcje  te 

służą  do  rysowania  punktu. Istnieje  wiele  wersji  glVertex, różniących  się  ilością  oraz  typem 

przyjmowanych  parametrów  wejściowych.  Liczbę  i  typ  parametrów  jakie  przyjmują  funkcje 

określa ich nazwa. Najczęściej korzysta się z funkcji glVertex2f oraz glVertex3f

 

 

 

 

 

 

W  celu  narysowani  pojedynczego  punktu  za  pomocą  glVertex,  należy  umieścić  ją 

wewnątrz  bloku  tworzonego  przez  parę  funkcji  glBegin  oraz  glEnd.  Funkcja  glBegin 

informuje bibliotekę OpenGL o rozpoczęciu rysowania grafiki. Przyjmuje ona jeden parametr 

będący typem rysowanego prymitywu. Typ ten określa się za pomocą parametru mode. 

 

void glBegin(GLenum mode) 

 

Każde  wywołanie  funkcji  glBegin  musi  zostać  zakończone  bezparametrową  funkcją 

glEnd. 

 

void glEnd() 

 

UWAGA!!! Blok opisany za pomocą funkcji glBegin oraz glEnd nie może być 

zagnieżdżony w innym bloku. 

 

 

 

Grafika Komputerowa 3D 

Temat: Rysowanie prymitywów 

 

Instrukcja 

laboratoryjna 

Przygotował: mgr inż. Maciej Lasota 

Biblioteka 

Rdzeń 

Liczba 

argumentów 

Typ 

argumentów 

background image

Laboratorium nr 3 

2/5 

 

1.1)  Rysowanie punktu 

 

Punkt  jest  najprostszym  prymitywem  graficznym.  W  celu  narysowania  punktu  jako 

parametr  wejściowy  dla  glBegin  podajemy  GL_POINTS.  Parametr  ten  informuje  bibliotekę 

OpenGL, aby narysowała punkt w trójwymiarowej przestrzeni kartezjańskiej. 

 

Przykład 1: 

 

glBegin(GL_POINTS); 

glVertex3f(5.0f, 5.0f, 5.0f); 

glEnd(); 

 

Przykład 2: 

 

float pozycja[] = {5.0f, 5.0f, 5.0f}; 

glBegin(GL_POINTS); 

glVertex3fv(pozycja); 

glEnd(); 

 

Rysowanym  punktom  oczywiście  można  ustawić  określony  rozmiar.  Służy  do  tego 

celu funkcja. 

 

void glPointSize(GLfloat rozmiar) 

 

Funkcja  przyjmuje  tylko  jeden  parametr,  będący  wielkością  punktu.  Podobnie  jak 

większość  funkcji  OpenGL  działa  ona  na  bieżąco.  Parametry  przez  nią  ustawione  będą 

oddziaływać  na  kolejne  funkcje  tak  długo,  aż  nie  wywołamy  jej  raz  jeszcze  z  innym 

parametrem. 

 

1.2)  Rysowanie linii 

 

Rysowanie  linii  jest  bardzo  zbliżone  do  rysowania  punktów.  Zmienia  się  tylko  stała 

przekazywana  do  funkcji  glBegin.  Stała  którą  przekazujemy,  nazywa  się  GL_LINES.  Jeśli 

chcemy  narysować  większą  ilość  linii,  musimy  wywołać  po  dwie  funkcje  glVertex3f  dla 

każdego wierzchołka.  

 

 

 

background image

Laboratorium nr 3 

3/5 

 

Przykład 3: 

 

glBegin(GL_LINES); 

glVertex3f(-5.0f, 0.0f, 3.0f); 

glVertex3f(5.0f, 3.0f, 0.0f); 

glEnd(); 

 

Podobnie  jak  w  przypadku  punktów  możliwe  jest  ustawienie  rozmiarów  (szerokości) 

rysowanej  linii  za  pomocą  funkcji  glLineWidth.  Funkcja  przyjmuje  tylko  jeden  parametr, 

będący szerokości linii. 

 

void glLineWidth(GLfloat rozmiar) 

 

1.3)  Rysowanie pozostałych prymitywów 

 

Tabela  poniżej  przedstawia  pozostałe  prymitywy  graficzne  dostępne  w  bibliotece 

OpenGL. 

 

Parametr 

Opis 

GL_LINE_STRIP 

Odcinki połączone (łamana) 

GL_LINE_LOOP 

Odcinki połączone (łamana zamknięta) 

GL_TRIANGLES 

Trójkąty 

GL_TRIANGLE_STRIP 

Połączone trójkąty (pasek trójkątów) 

GL_TRIANGLE_FAN 

Połączone trójkąty (wachlarz) 

GL_QUADS 

Czworokąty 

GL_QUAD_STRIP 

Połączone czworokąty 

GL_POLYGON 

Wielokąty o dowolnej liczbie wierzchołków 

 

1.4)  Kierunek rysowania 

 

W  celu  określenie  kierunku  rysowania  (ściany  przedniej  i  tylnej)  wielokąta 

wykorzystujemy funkcję glFrontFace.  

 

background image

Laboratorium nr 3 

4/5 

 

Funkcja  ta  przyjmuje  jeden  parametr  określający  kierunek  rysowania,  zgodny  z 

ruchem  wskazówek  zegara  GL_CW,  lub  kierunek  przeciwny  do  ruchu  wskazówek  zegara 

GL_CCW

 

2) 

Ustawianie kolorów 

 

Nadawaniem koloru w bibliotece OpenGL zajmuje się rodzina funkcji glColor. Funkcje 

z rodziny glColor mogą przyjmować trzy lub cztery parametr. 

 

void glColor3f(GLfloat R, GLfloat G, GLfloat B) 

void glColor4f(GLfloat R, GLfloat G, GLfloat B, GLfloat A) 

 

Kolor  podaje  się  w  postaci  trzech  składowych  RGB  w  przypadku  funkcji 

trójparametrowych,  natomiast  w  postaci  RGBA  w  przypadku  funkcji  czteroparametrowych 

ostatni parametr jest tzw. współczynnikiem alfa. 

 

3) 

Czyszczenie bufora kolorów oraz głębi 

 

W OpenGL wyróżnimy cztery rodzaj buforów: bufor koloru, głębi, szablonu (wzorca) i 

akumulacyjny,  Najczęściej  stosowane  są  dwa  pierwsze  czyli  bufor  kolorów  odpowiedzialny 

za  prawidłowe  wyświetlanie  kolorów  oraz  bufor  głębi  odpowiedzialny  za  poprawne 

renderowanie  obiektów  w  przestrzeni  3D.  Za  czyszczenie  buforów  odpowiedzialna  jest 

funkcja. 

 

void glClear(GLbitfield mask) 

 
Jako 

parametr 

przyjmuje 

ona 

stałe 

określającą 

rodzaj 

bufora 

(GL_COLOR_BUFFER_BIT, 

GL_DEPTH_BUFFER_BIT, 

GL_ACCUM_BUFFER_BIT, 

GL_STENCIL_BUFFER_BIT),  który  chcemy  wyczyścić.  Bufory  można  łączyć  za  pomocą 

operacji „OR”.  

 

Dodatkowo do czyszczenie bufora kolorów na wybrany kolor służy funkcja 

 

void glClearColor(GLfloat R, GLfloat G, GLfloat B, GLfloat A) 

 
Przyjmuje  ona  cztery  parametry  określające  kolor  w  formacie  RGBA  na  jaki  ma 

zostać wyczyszczony bufor. 

 

background image

Laboratorium nr 3 

5/5 

 

3) 

Antialiasing 

 

Antialiasing  umożliwia  wygładzenie  ostrych  krawędzi  punktów  lub  linii.  W  OpenGL 

włączenie antialiasingu polega na aktywowaniu opcji GL_POINT_SMOOTH dla punktów lub 

GL_LINE_SMOOTH dla linii. Aktywowane odpowiednich funkcji dokonywane jest za pomocą 

funkcji. 

 

void glEnable(GLenum mode) 

 

Wyłączenie opcji odbywa się przez wywołanie funkcji. 

 

void glDisable(GLenum mode) 

 

4) 

Cieniowanie 

 

W przypadku kolorowania wielokątów, kolory określane są dla wierzchołków, a nie dla 

wielokątów.  O  tym,  czy  wielokąt  będzie  posiadał  jednolity  kolor  (kolor  określony  dla 

ostatniego  wierzchołka),  czy  też  kolor  będzie  się  zmieniał  płynnie  od  wierzchołka  do 

wierzchołka,  decyduje  model  cieniowania.  Aby  ustawić  odpowiedni  model  cieniowania 

wykorzystywana jest funkcja. 

 

void glShadeModel(GLenum mode) 

 

Funkcja  przyjmuje  jeden  z  dwóch  parametrów  GL_FLAT  określający  model 

cieniowania  jednolitego  (płaskiego)  oraz  GL_SMOOTH  model  cieniowania  płynnego 

przejścia.  Cieniowanie  jest  bardzo  ważnym  elementem  wizualizacji.  Wykorzystywane  jest  

m. in. przy obliczeniach związanych ze światłem.