[Kurs OpenGL, C++] VII Wie

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


Wyszukiwarka

Podobne podstrony:
[Kurs OpenGL, C++] VIII Ko
[Kurs OpenGL, C++] IV Prze
[Kurs OpenGL, C++] III Def
[Kurs OpenGL, C++] VI Elem
[Kurs OpenGL, C++] II Pier
[Kurs OpenGL, C++] V Okraw
[Kurs OpenGL, C++] I Podstawy
Darmowy Kurs OpenGL, C++ On
JAK SAMEMU ZROBIĆ TIPSY KROK PO KROKU(1), Kosmetologia, ZDOBIENIE PAZNOKCI TIPSY- metoda żelowa, k
kurs html rozdział VII
WYKŁAD VII
KURS ETYKI
Choroba hemolityczna p odu na kurs
7 tydzień Wielkanocy, VII Niedziela Wielkanocna A
zapotrzebowanie ustroju na skladniki odzywcze 12 01 2009 kurs dla pielegniarek (2)
kurs
wady postawy kurs

więcej podobnych podstron