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
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
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
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
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
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
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
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