background image

 Strona główna

 Kursy

 Artykuły

 Forum

 Pliki

 Promuj Nas!

 

[Kurs OpenGL, C++] VII. Wielokąty

http://kursy.ddt.pl/?LessonId=205

1 z 8

2010-04-30 14:23

background image

Powrót

Historia odwiedzonych stron

Poprzednia lekcja

Kurs OpenGL, C++

Następna lekcja

Autor: Janusz Ganczarski

http://januszg.hg.pl/opengl/

VII. Wielokąty

Przy  rysowaniu  wielokątów  biblioteka  OpenGL  oferuje  znacznie  większe  możliwości  niż  przy  rysowaniu

pozostałych   prymitywów   gra?cznych.   Zamieszczone   poniżej   informacje   dotyczą   wielokątów   de?niowanych
pomiędzy   wywołaniami   funkcji   glBegin   i   glEnd   (stałe:   GL_TRIANGLE_STRIP,   GL_TRIANGLES,
GL_TRIANGLE_FAN,   GL_QUADS,   GL_QUAD_STRIP   i   GL_POLYGON)   oraz   częściowo   prostokątów
rysowanych za pomocą funkcji z grupy glRect.

7.1. Strony wielokąta

Podstawową   zadaniem  przy   rysowaniu   wielokątów  jest   określenie   stron  wielokąta.   Biblioteka   OpenGL

operuje   pojęciem   przedniej   i   tylnej   strony   wielokąta.   Domyślnie   przednią   stroną   wielokąta   jest   ta,   której
wierzchołki uporządkowane są w kierunku przeciwnym do ruchu wskazówek zegara. Zmianę sposobu określania
stron wielokątów umożliwia funkcja:

void

 glFrontFace (GLenum mode)

Parametr mode przyjmuje jedną z dwóch wartości:

GL_CW - przednia  strona wielokąta  z  wierzchołkami  uporządkowanymi  zgodnie  z  ruchem  wskazówek
zegara,
GL_CCW   -   przednia   strona   wielokąta   z   wierzchołkami   uporządkowanymi   odwrotnie   do   ruchu
wskazówek zegara.

Określenie   stron  wielokątów  umożliwia   optymalizację   procesu   rysowania   sceny   3D.   W  wielu   bowiem

przypadkach ?gury tworzone z wielokątów są obiektami zamkniętymi, a ich wewnętrzna część nie jest widoczna
w programie. W takich sytuacjach OpenGL umożliwia wybór, która strona wielokąta nie ma być rysowana. W
tym celu należy wywołać funkcję:

void

 glCullFace (GLenum mode)

której parametr mode przyjmuje jedną z wartości:

GL_FRONT - nie jest rysowana przednia strona,
GL_BACK - nie jest rysowana tylna strona,
GL_FRONT_AND_BACK - nie są rysowane obie strony, przednia i tylna.

Zauważmy, że użycie parametru GL_FRONT_AND_BACK spowoduje wyłączenie rysowania wielokątów.

Domyślnie   opcja   wyboru   renderowanej   strony   wielokątów   jest   wyłączona,   czyli   rysowane   są   obie   strony
wielokątów. Po włączeniu tej opcji (funkcja glEnable z parametrem GL_CULL_FACE) domyślnie rysowana jest
tylko przednia strona wielokątów.

7.2. Tryby rysowania

Biblioteka   OpenGL   umożliwia   także   wybór   różnego   sposobu   rysowania   przednich   i   tylnych   stron

wielokątów. Realizuje to funkcja:

void

 glPolygonMode (GLenum face, GLenum mode)

Parametr face określa stronę wielokąta:

GL_FRONT - strona przednia,
GL_BACK - strona tylna,
GL_FRONT_AND_BACK - obie strony, przednia i tylna.

Parametr mode określa metodę rysowania wybranej strony wielokąta:

GL_POINT - rysowane są tylko wierzchołki wielokąta,
GL_LINE - rysowane są tylko krawędzie wielokąta,
GL_FILL - rysowany jest wypełniony wielokąt.

Domyślne ustawione jest rysowanie wielokątów wypełnionych po obu stronach. Warto zauważyć, że przy

rysowaniu   wielokątów  można   stosować   także   ustawienia   dotyczące   wielkości   punktów,  szerokości  linii   oraz
wzorów linii.

7.3. Wypełnianie wielokątów wzorem

Podobnie jak w przypadku linii także wielokąty można rysować przy użyciu wzoru. Wzór ma postać mapy

bitowej o rozmiarach 32 × 32 pikseli i jest reprezentowany przez tablicę 128 liczb typu GLubyte. Dane mapy
bitowej  zapisywane   są   wierszami   w  odwrotnej  kolejności  tj.   od   wiersza   dolnego   do   górnego.   Zmianę   wzoru
wypełnienia wielokąta umożliwia funkcja:

void

 glPolygonStipple (

const

 GLubyte *mask)

Domyślnie wypełnianie wielokątów wzorem jest wyłączone, stąd w celu zastosowania tej możliwości należy

wywołać funkcję glEnable z parametrem GL_POLYGON_STIPPLE.

7.4. Ukrywanie krawędzi wielokąta

Domyślnie   OpenGL   rysuje   wszystkie   krawędzie   wielokątów.   Jednak   przy   wyświetlaniu   wielokątów

złożonych z wielu ?gur podstawowych (np. trójkątów) w trybie GL_LINE przydatna jest możliwość ukrywanie
wybranych  krawędzi   wielokątów.   Wybór   czy   aktualna   krawędź  ma   być   rysowana   czy   też  nie   umożliwiają
funkcje:

P anel  Logowania

dast19

Administracja

Twój profil

Wyloguj

Uż yt kowników

Obecnie aktywnych:

14

Zalogowanych:

2

Zarejestrowanych:

3855

Ostatnie 24h:

646

Non-cookie 24h:

2051

Wszystkich:

178944

O c z e kuj ąc e  t e mat y

Lista jest pusta.

Pokaż wszystkie (0)

Os tatnia  Aktualizacja

2010-04-29 22:01:07

(wczoraj)

O st atnio akt ywni

dast19

1 min

Piotr Szawdyński

5 min

Iname

 

(√ιק)

17 min

szywro5

29 min

Saiph

34 min

markon

57 min

imandre

75 min

WunM

93 min

kuba1817

2 godz

killersft

2 godz

fish13

2 godz

kizia

2 godz

Szkolenia programowanie

Wysoka jakość szkoleń.
Terminy uzgadniane
indywidualnie.

www.learningwww.pl

ACAD LT 2010

i inne programy do
projektowania. Więcej
informacji na stronie

www.ascad.pl/autocad/

[Kurs OpenGL, C++] VII. Wielokąty

http://kursy.ddt.pl/?LessonId=205

2 z 8

2010-04-30 14:23

background image

void

 glEdgeFlag (GLboolean flag)

void

 glEdgeFlagv (

const

 GLboolean *flag)

Parametr flag określa czy bieżąca krawędź wielokąta ma być rysowana (GL_TRUE) czy nie (GL_FALSE).

Ustawienie wskaźnika rysowania krawędzi obowiązuje aż do jego zmiany. Jak się już Czytelnik domyślił stałe
GL_TRUE i GL_FALSE to zde?niowane w bibliotece OpenGL odpowiedniki true i false z języka C++.

Ukrywanie krawędzi nie działa w przypadku prostokątów rysowanych przy użyciu funkcji z grupy glRect.

7.5. Podział wielokątów

Funkcje   biblioteki  OpenGL  nie   umożliwiają   np.   rysowania   wielokątów  z  dziurami.   W  takim  przypadku

przydatne okazują się mechanizmy zawarte w bibliotece GLU umożliwiające podział (kafelkowanie) wielokątów.

Do   kafelkowania   używana  jest   struktura   (w  przypadku   języka   C++  klasa)  GLUtesselator.   Można   także

używać   alternatywnych  nazw  klas/struktur:   GLUtesselatorObj   i   GLUtriangulatorObj   Obiekt   podziału   tworzy
wywołanie funkcji gluNewTess:

GLUtesselator *gluNewTess (

void

)

która zwraca wskaźnik do struktury (klasy) GLUtesselator, niezbędny w wywołaniach pozostałych funkcji

obsługujących kafelkowanie wielokątów.  Po zakończeniu operacji  na  danym obiekcie podziału należy zwolnić
przydzieloną mu pamięć wywołując funkcję:

void

 gluDeleteTess (GLUtesselator *tess)

7.5.1. De?nicja wielokąta

De?nicję wielokąta rozpoczyna wywołanie funkcji:

void

 gluTessBeginPolygon (GLUtesselator *tess,

GLvoid *polygon_data)

gdzie parametr polygon data zawiera dowolne dane użytkownika i w szczególności może przyjąć wartość

NULL. Dane te przekazywane są do opisanych dalej funkcji zwrotnych. Po zakończeniu de?niowania wielokąta
trzeba wywołać funkcję:

void

 gluTessEndPolygon (GLUtesselator *tess)

Wewnątrz wielokąta umieszcza się de?nicje jednego lub wielu konturów.
De?nicja każdego konturu zawiera się pomiędzy wywołaniami funkcji:

void

 gluTessBeginContour (GLUtesselator *tess)

void

 gluTessEndContour (GLUtesselator *tess)

Kontury   wielokąta   opisuje   się   za   pomocą   współrzędnych   ich   wierzchołków,   przy   czym   pierwszy

wierzchołek jest automatycznie łączony z ostatnim.

Wierzchołek de?niuje się przy użyciu funkcji:

void

 gluTessVertex (GLUtesselator *tess,

GLdouble coords[3],
GLvoid *vertex_data)

gdzie parametr coords określa współrzędne (x, y, z) wierzchołka, a w parametrze vertex data przekazywane

są  dodatkowe  dane   opisujące   wierzchołek.   Może   to   być   np.   jego   kolor  c  zy  współrzędne   tekstury.   Dane   te
przekazywane   są   jako   parametr   opisanych  dalej   funkcji   zwrotnych  GLU_VERTEX,   GLU_TESS_VERTEX  i
GLU_TESS_VERTEX_DATA.

W   celu   zachowania   wstecznej   zgodności   GLU   w   wersjach   1.2   i   1.3   udostępnia   także   pochodzący   z

wcześniejszych  wersji   biblioteki   interfejs   do   de?niowania   wielokątów.   Składają   się   na   niego   trzy   poniższe
funkcje:

void

 gluBeginPolygon (GLUtesselator *tess)

void

 gluNextContour (GLUtesselator *tess,

GLenum type)

void

 gluEndPolygon (GLUtesselator *tess)

Funkcja gluBeginPolygon tworzy nowy wielokąt i jednocześnie stanowi początek de?nicji konturu. Stanowi

więc   odpowiednik   wywołania   kolejno   funkcji   gluTessBeginPolygon   i   gluTessBeginContour.   Druga   funkcja
tworzy   nowy   kontur  i  odpowiada   wywołaniu  gluTessEndContour  i  gluTessBeginContour.   Wartość   parametru
type   jest   ignorowana,   choć   dostępne   są   stałe,   które   określały   jego   dopuszczalne   wartości:   GLU_CW,
GLU_CCW, GLU_INTERIOR, GLU_EXTERIOR i GLU_UNKNOWN.

Ostatnia   funkcja   gluEndPolygon  jednocześnie   kończy   de?nicję   konturu   i  całego   wielokąta.   Jest  to   więc

odpowiednik wywołania funkcji gluTessEndContour i gluTessEndPolygon.

Specy?kacja biblioteki GLU określa trzy powyższe funkcje jako przestarzałe i zaleca stosowanie wyłącznie

nowego interfejsu obsługi wielokątów i konturów.

7.5.2. Funkcje zwrotne

Po   utworzeniu   obiektu   podziału   trzeba   zde?niować   funkcje   zwrotne   używane   podczas   różnych  etapów

kafelkowania wielokątów. Dołączenie funkcji zwrotnej realizuje funkcja:

void

 gluTessCallback (GLUtesselator *tess,

GLenum which,

void

 (*fn)())

której  parametr  which  określa   rodzaj  wykonywanej  czynności  lub   rodzaj  generowanych  danych  podczas

kafelkowania wielokąta, a odpowiednia funkcja zwrotna wskazywana jest w parametrze fn.

Funkcje zwrotne występują w dwóch wersjach. Pierwsza z nich zwraca tylko dane związane z charakterem

swojego   działania   (np.   współrzędne   wierzchołków   wielokąta).   Wersje   alternatywne   zwracają   dodatkowo
parametr   polygon   data   zawierający   dane   użytkownika   przekazane   w   parametrze   polygon   data   funkcji
gluTessBeginPolygon.

Funkcje zwrotne renderera obiektów podziału określone są następującymi stałymi:

[Kurs OpenGL, C++] VII. Wielokąty

http://kursy.ddt.pl/?LessonId=205

3 z 8

2010-04-30 14:23

background image

GLU_BEGIN, GLU_TESS_BEGIN, GLU_TESS_BEGIN_DATA - początek de?niowania współrzędnych
wierzchołków prymitywu; funkcje zwrotne mają
postać:

void

 begin (GLenum type)

void

 beginData (GLenum type, 

void

 *polygon_data)

gdzie parametr type określa rodzaj renderowanego prymitywu i przyjmuje jedną z poznanych już wartości:

GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, GL_TRIANGLES i GL_LINE_LOOP,

GLU_EDGE_FLAG, GLU_TESS_EDGE_FLAG, GLU_TESS_EDGE_FLAG_DATA - zmiana znacznika
rysowania krawędzi wielokąta (odpowiednik działania funkcji glEdgeFlag); funkcje zwrotne mają postać:

void

 edgeFlag (GLboolean flag)

void

 edgeFlagData (GLboolean flag, 

void

 *polygon_data)

gdzie parametr flag zawiera nową wartość znacznika rysowania krawędzi wielokąta (GL_TRUE - krawędź

zewnętrzna,   GL_FALSE   -   krawędź   wewnętrzna);   funkcja   ta   jest   zawsze   wywołana   przed   funkcją   zwrotną
wywoływaną przy de?niowaniu wierzchołka,

GLU_VERTEX,   GLU_TESS_VERTEX,   GLU_TESS_VERTEX_DATA   -   funkcja   wywoływana   przy
de?niowaniu wierzchołka renderowanego prymitywu; funkcje zwrotne mają postać:

void

 vertex (

void

 *vertex_data)

void

 vertexData (

void

 *vertex_data, 

void

 *polygon_data)

gdzie parametr vertex data jest kopią analogicznego parametru funkcji gluTessVertex,

GLU_END,   GLU_TESS_END,   GLU_TESS_END_DATA   -   koniec   de?niowania   współrzędnych
wierzchołków prymitywu; funkcje zwrotne mają postać:

void

 end ()

void

 endData (

void

 *polygon_data)

GLU_ERROR,   GLU_TESS_ERROR,   GLU_TESS_ERROR_DATA   -   błąd   podczas   kafelkowania
wielokąta; funkcje zwrotne mają postać:

void

 error (GLenum errno)

void

 errorData (GLenum errno, 

void

 *polygon_data)

gdzie parametr errno oznacza kod błędu; zestawienie kodów błędów obiektu podziału wielokątów zawiera

tabela 1,

GLU_TESS_COMBINE, GLU_TESS_COMBINE_DATA - funkcja wywoływana, gdy
podczas   kafelkowania   wielokąta   występuje   samoprzecięcie   jego   krawędzi   i   trzeba   utworzyć   nowy
wierzchołek; funkcje zwrotne mają postać:

void

 combine (GLdouble coords[3],

void

 *vertex_data[4],

GLfloat weight[4],

void

 **outData)

void

 combineData (GLdouble coords[3],

void

 *vertex_data[4],

GLfloat weight[4],

void

 **outData,

void

 *polygon_data)

gdzie   parametr   coords   zawiera   współrzędne   nowego   wierzchołka,   parametr   vertex   data   opisuje   nowy

wierzchołek  jako  liniową  kombinację  czterech  istniejących  wierzchołków,  a  parametr  weight  zawiera  wartości
współczynników liniowej kombinacji wierzchołków o sumie zawsze równej 1; dane nowego wierzchołka, na które
obok   współrzędnych  mogą   składać   się   inne   informacje   wymagane   przez  program,   przekazywane   są   poprzez
parametr outData.

numer błędu

opis  błędu

GLU_TESS_MISSING_BEGIN_POLYGON
GLU_TESS_ERROR1

gluTessBeginPolygon

 

musi

 

poprzedzać

gluTessEndPolygon

GLU_TESS_MISSING_BEGIN_CONTOUR
GLU_TESS_ERROR2

gluTessBeginContour

 

musi

 

poprzedzać

gluTessEndContour

GLU_TESS_MISSING_END_POLYGON
GLU_TESS_ERROR3

gluTessEndPolygon musi być za gluTessBeginPolygon

GLU_TESS_MISSING_END_CONTOUR
GLU_TESS_ERROR4

gluTessEndContour musi być za gluTessBeginContour

GLU_TESS_COORD_TOO_LARGE
GLU_TESS_ERROR5

ilość   współrzędnych   wielokąta   większa   od
GLU_TESS_MAX_COORD

GLU_TESS_NEED_COMBINE_CALLBACK
GLU_TESS_ERROR6

wymagana   funkcja   zwrotna   GLU_TESS_COMBINE   lub
GLU_TESS_COMBINE_DATA

Tabela 1:  Zestawienie  kodów  błędów  obiektów podziału  wielokątów

Wszystkie funkcje zwrotne domyślnie są niezde?niowane. W przypadku konieczności deaktywacji wybranej

funkcji zwrotnej jako parametr fn funkcji gluTessCallback trzeba podać wartość NULL.

7.5.3. Właściwości kafelkowania

Mody?kację właściwości podziału wielokątów umożliwia funkcja:

void

 gluTessProperty (GLUtesselator *tess,

GLenum which,
GLdouble data)

której parametr which określa rodzaj  mody?kowanej  właściwości, a parametr data zawiera nową  wartość

właściwości.   Parametr   which   może   przyjąć   jedną   z   trzech   wartości:   GLU_TESS_WINDING_RULE,
GLU_TESS_BOUNDARY_ONLY i GLU_TESS_TOLERANCE.

[Kurs OpenGL, C++] VII. Wielokąty

http://kursy.ddt.pl/?LessonId=205

4 z 8

2010-04-30 14:23

background image

Pierwsza   właściwość   GLU_TESS_WINDING_RULE   określa,   która   z   części   wielokąta   (który   kontur)

stanowi   część   wewnętrzną   wielokąta.   W  tym  celu   biblioteka   GLU  określa   dla   każdego   konturu   tzw.   liczby
nawijania (ang.

winding numbers). Wartość 1 otrzymuje każdy kontur złożony z krawędzi o kierunku odwrotnym do ruchu

wskazówek zegara. Wartość -1 przyjmuje kontur złożony z krawędzi o kierunku zgodnym z ruchem wskazówek
zegara.   Wartość  liczby  nawijania   konturu  wewnętrznego  jest  sumą   wartości  liczby  tego  konturu  i  wszystkich
konturów zewnętrznych. Liczby nawijania dla dwóch przykładowych konturów przedstawia rysunek 1.

Możliwe są następujące wartości właściwości GLU_TESS_WINDING_RULE:

GLU_TESS_WINDING_ODD - wnętrze wielokąta składa się z konturów z nieparzystą liczbą nawijania
(wartość domyślna),
GLU_TESS_WINDING_NONZERO - wnętrze wielokąta stanowią kontury z niezerową liczbą nawijania,
GLU_TESS_WINDING_POSITIVE - wnętrze wielokąta składa się konturów

z większą od zera liczbą nawijania,

Rysunek 1. Liczby nawijania dla przykładowych konturów

GLU_TESS_WINDING_NEGATIVE - wnętrze wielokąta stanowią kontury z ujemną liczbą nawijania,
GLU_TESS_WINDING_ABS_GEQ_TWO - wnętrze wielokąta składa się z części

wspólnej dwóch konturów (prawidłowo działa tylko dla wielokąta z dwoma konturami).
Właściwość   GLU_TESS_BOUNDARY_ONLY   przyjmuje   wartości   logiczne   GL_TRUE   i   GL_FALSE.

Wartość   GL_TRUE   oznacza,  że   renderowane   są   wyłącznie   krawędzie   wielokąta.   Tylko   w  takim  przypadku
wartość   parametru   type   funkcji   zwrotnych  GLU_BEGIN,  GLU_TESS_BEGIN   i   GLU_TESS_BEGIN_DATA
wynosi GL_LINE_LOOP. Domyślna wartość GL_TRUE oznacza, że renderowany jest wypełniony wielokąt.

Trzecia   i   ostatnia   właściwość   GLU_TESS_TOLERANCE   określa   tolerancję   używaną   przy   podziale

wielokąta   na   trójkąty   w   przypadku   występowania   blisko   położonych   wierzchołków.   Właściwość   ta   jest
opcjonalna i może być pominięta przez implementację biblioteki GLU. Domyślnie wartość tolerancji wynosi 0.

Pobieranie wartości wybranych właściwości kafelkowania umożliwia funkcja:

void

 gluGetTessProperty (GLUtesselator *tess,

GLenum which,
GLdouble *data)

której parametr which przyjmuje takie same wartości jak analogiczny parametr funkcji gluTessProperty.
Ostatnią funkcją biblioteki GLU związaną z kafelkowaniem wielokątów jest funkcja:

void

 gluTessNormal (GLUtesselator *tess,

GLdouble valueX,
GLdouble valueY, GLdouble valueZ)

która   w  parametrach  valueX,  valueY   i  valueZ  zawiera   współrzędne   wektora   normalnego   dla   każdego   z

trójkątów generowanych podczas podziału wielokąta. Funkcja jest oczywiście szczególnie użyteczna wówczas,
gdy cały wielokąt znajduje się w jednej płaszczyźnie. Domyślnie współrzędne wektora normalnego wynoszą (0,
0, 0).

7.6. Programy przykładowe

Pierwszy   przykładowy   program   (plik   wielokaty.cpp)   prezentuje   wszystkie   opisane   wyżej   możliwości

związane z rysowaniem wielokątów. Wybór rodzaju wielokąta oraz opcji jego rysowania tradycyjnie umożliwia
menu podręczne.

W  przykładowym  programie   pobieramy   i   wyświetlamy   wartości  wybranych  zmiennych  maszyny   stanów

OpenGL. Odczyt parametru określanego wywołaniem funkcji glEnable/glDisable umożliwia funkcja:

GLboolean glIsEnabled (GLenum cap)

która zwraca odpowiednio wartość GL_TRUE lub GL_FALSE. Parametr cap przyjmuje taką samą wartość

jak parametr funkcji glEnable/glDisable.

Poza   powyższą   funkcją   i   poznanymi   już   funkcjami   glGetBooleanv,   glGetDoublev,   glGetFloatv   i

glGetIntegerv do pobierania wartości  niektórych zmiennych maszyny  stanów OpenGL  służą specjalne  funkcje.
Przykładem jest niezastosowana w poniższym programie funkcja pobierająca wzór wypełnienia wielokąta:

void

 glGetPolygonStipple (GLubyte *mask)

W przykładowym programie pobierane są i wyświetlane na ekranie m.in.
następujące zmienne maszyny stanów OpenGL:

GL_FRONT_FACE - orientacja stron wielokąta,
GL_CULL_FACE_MODE - nierysowana strona wielokąta,
GL_POLYGON_MODE - sposób rysowania przedniej i tylnej strony wielokąta,
GL_EDGE_FLAG - ukrywanie krawędzi wielokąta,
GL_POINT_SIZE - bieżąca wielkość punktów,
GL_LINE_WIDTH - bieżąca szerokość linii.

Przykładowe efekty działania programu przestawiają rysunki: 2, 3, 4 i 5.

[Kurs OpenGL, C++] VII. Wielokąty

http://kursy.ddt.pl/?LessonId=205

5 z 8

2010-04-30 14:23

background image

Rysunek 2. Program Wielokąty - trójkąty

Rysunek 3. Program Wielokąty - wstęga trójkątów

Rysunek 4. Program Wielokąty - wachlarz trójkątów

[Kurs OpenGL, C++] VII. Wielokąty

http://kursy.ddt.pl/?LessonId=205

6 z 8

2010-04-30 14:23

background image

Rysunek 5. Program Wielokąty - czworokąty koniec

7.6.1. Plik podzial_wielokatow.cpp

/*
(c) Janusz Ganczarski
http://www.januszg.hg.pl
JanuszG(małpeczka)enter.net.pl
*/

#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// stałe do obsługi menu podręcznego

enum

{
  CLEAR_VERTEX,   

// usuwanie wierzchołków

  EXIT            

// wyjście

};

// maksymalna ilość wierzchołków wielokąta

#define MAX_VERTEX 2000

// tablica ze współrzędnymi wierzchołków wielokąta

7.6.2. Plik wielokaty.cpp

/*
(c) Janusz Ganczarski
http://www.januszg.hg.pl
JanuszG(małpeczka)enter.net.pl
*/

#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <vector>

// wzór wypełnienia wielokąta - szachownica 4x4

GLubyte chequers4x4 [] =
{
  0x0F, 0x0F, 0x0F, 0x0F,   

// 00001111000011110000111100001111

  0x0F, 0x0F, 0x0F, 0x0F,   

// 00001111000011110000111100001111

  0x0F, 0x0F, 0x0F, 0x0F,   

// 00001111000011110000111100001111

  0x0F, 0x0F, 0x0F, 0x0F,   

// 00001111000011110000111100001111

  0xF0, 0xF0, 0xF0, 0xF0,   

// 11110000111100001111000011110000

  0xF0, 0xF0, 0xF0, 0xF0,   

// 11110000111100001111000011110000

  0xF0, 0xF0, 0xF0, 0xF0,   

// 11110000111100001111000011110000

  0xF0, 0xF0, 0xF0, 0xF0,   

// 11110000111100001111000011110000

  0x0F, 0x0F, 0x0F, 0x0F,   

// 00001111000011110000111100001111

  0x0F, 0x0F, 0x0F, 0x0F,   

// 00001111000011110000111100001111

7.7. Źródło materiału

[Kurs OpenGL, C++] VII. Wielokąty

http://kursy.ddt.pl/?LessonId=205

7 z 8

2010-04-30 14:23

background image

Materiał został pobrany ze strony 

http://januszg.hg.pl/opengl/

, za uprzednim otrzymaniem zgody od jego

autora. Podziekowania dla 

Janusza Ganczarskiego

 za udostępnienie materiałów 

Poprzednia lekcja

Kurs OpenGL, C++

Następna lekcja

Wsz e lkie  prawa z ast rz e ż one . Aut or:  ź ródło z e wnę t rz ne

Wszystkie   teksty   są   chronione   prawami   autorskimi.   Kopiowanie   lub
rozpowszechnianie treści bez wyraźnej zgody jego autora jest zabronione.

Powrót

Historia odwiedzonych stron

O portalu

Archiwum

Historia

Indeks

Regulamin

Wyszukiwarka

Linki

© Wszelkie prawa zastrzeżone   2005-2010

Czas wygenerowania strony: 0.069s

Autor: Piotr Szawdyński

[Kurs OpenGL, C++] VII. Wielokąty

http://kursy.ddt.pl/?LessonId=205

8 z 8

2010-04-30 14:23