[ Pobierz całość w formacie PDF ]
.Ten komunikat jest wysy³any przez Windows // za ka¿dymrazem, gdy okno wymaga odœwie¿enia case WM_PAINT:(// Wywo³anie kodu rysunkowego OpenGLRenderScene();// Wywo³anie funkcji przerzucaj¹cej bufory SwapBuffers(hDC);Rozdzia³ 4.* OpenGL for Windows: OpenGL + Win32 = Wiggle_________________115LION).Gdy funkcja WndProc otrzyma komunikat WM_TIMER, wykonywany jestpo­ni¿szy kod:case WMJTIMER: { IdleFunctionO ;IiwalidateRect (hWnd, NULL, FALSE) ;}break;Funkcja IdleFunction jest identyczna z funkcj¹ z przyk³adu BOUNCE2, z jednymwy­j¹tkiem: nie zawiera wywo³ania funkcji RenderScene().Zamiast niejwywo³ywana jest funkcja InvalidateRect, powoduj¹ca wys³anie przez systemkomunikatu WM_PAINT do okna, czyli w efekcie odmalowanie jego zawartoœci.Œwiat³a, kamera, akcja!Wszystko ju¿ jest na swoim miejscu, nadszed³ wiêc czas na prawdziwe dzia³ania.Kod OpenGL przeznaczony do rysowania sceny jest wywo³ywany z wnêtrza proceduryob­s³ugi komunikatu WM_PAINT.Procedura wywo³uje funkcjê RenderScene (tak¿ezapo­¿yczon¹ z przyk³adu BOUNCE2), przerzuca zawartoœæ buforów oraz zatwierdzaobszar roboczy okna (w celu zablokowania nadmiarowych komunikatów WM_PAINT).case WM_PAINT: {// Wywo³anie kodu rysunkowego OpenGL RenderScene();// Wywo³anie funkcji przerzucaj¹cej bufory SwapBuffers(hDC);// Zatwierdzenie odmalowanego obszaruYalidateRect(hWnd,NULL);}break;Wystêpuje tu nowa funkcja GDI Windows, SwapBuffers.Ta funkcja pe³ni tê sam¹rolê, co auxSwapBuffers - w oknie z podwójnym buforowaniem przerzuca do oknazawartoœæ niewidocznego (tylnego) bufora.Jednym parametrem funkcji jestkontekst urz¹dzenia.Zwróæ uwagê, ¿e ten kontekst urz¹dzenia musi posiadaæformat pikseli z ustawionym znacznikiem PFD_DOUBLEBUFFER; w przeciwnym raziedzia³anie funkcji siê nie powiedzie.I ju¿! W tym momencie posiadasz szkielet kodu, w który mo¿esz wstawiæ w³asn¹,do­woln¹ procedurê renderuj¹c¹ OpenGL.Bêdzie ona korzysta³a z prawdziwego oknaWindows, z wszystkimi jego cechami (skalowaniem, przenoszeniem, zamykaniemitd.).Co wiêcej, mo¿esz oczywiœcie u¿yæ tego kodu do utworzenia okna OpenGLstanowi¹­cego czêœæ rozbudowanej aplikacji, zawieraj¹cej inne okna, menu itd.116 ____ ____ ____ ___ ____ Czêœæ l •» Wprowadzenie do OpenGLBrakuj¹cy kod obs³ugi paletyGdy porównasz zamieszczony w ksi¹¿ce kod programu GLRECT z ko­dem programu nado³¹czonej do ksi¹¿ki p³ytce CD-ROM, w tym drugim zauwa¿ysz procedury obs³ugidwóch dodatkowych komunikatów.Te dwa komunikaty: WM_QUERYPALETTE iWM_PALETTECHANGED ob­s³uguj¹ odwzorowanie palety Windows.Kolejna funkcja,GetOpenGL-Palette, tworzy dla nas paletê kolorów.Palety s¹ z³em koniecznym,jeœli mamy zamiar korzystaæ z kart graficznych potrafi¹cych wyœwietliæmaksymalnie 256 kolorów.Bez tego kodu moglibyœmy nie otrzymaæ ko­lorów o którepoprosilibyœmy funkcj¹ glColor, zaœ w przypadku pewnych kolorów, nieotrzymalibyœmy nawet ich przybli¿enia.Palety i kolory w Windows stanowi¹ wa¿nytemat, którym zajmiemy siê szczegó³owo w rozdziale 8.To kolejne irytuj¹cezagadnienie, którego roztrz¹sania stara³a siê nam oszczêdziæ biblioteka AUX!PodsumowaniePo przeczytaniu tego rozdzia³u powinieneœ zdawaæ sobie sprawê, o iluuci¹¿liwych szczegó³ach nie musimy pamiêtaæ korzystaj¹c z biblioteki AUX.Pozna³eœ koncepcjê kontekstów renderowania, wprowadzon¹ do Windows GDI po to,aby OpenGL wie­dzia³o, w którym oknie ma wykonywaæ operacje graficzne.Wieszju¿, jak wybór i usta­wienie formatu pikseli przygotowuje kontekst urz¹dzeniaprzed wykorzystaniem go do stworzenia kontekstu renderowania.Oprócz tegodowiedzia³eœ siê, na które komunikaty okienkowe i w jaki sposób powinienodpowiadaæ program OpenGL w Windows.W poni¿szej sekcji podrêcznika znajdziesz usystematyzowane informacje ofunkcjach opi­sywanych w tym rozdziale oraz dodatkowe informacje o funkcjachjeszcze nie omawia­nych, gdy¿ to wymaga³oby poznania pewnych zagadnieñ ikoncepcji, które jeszcze nie by³y poruszane.Przyk³ady zastosowania tychfunkcji znajdziesz na p³ytce CD-ROM do³¹­czonej do ksi¹¿ki.Zachêcamy dosamodzielnej analizy i modyfikowania tych przyk³adów.PodrêcznikChoosePixel FormatPrzeznaczenie Wybiera format pikseli najbardziej zbli¿ony do formatu za¿¹danegow strukturze PIXELFORMATDESCRIPTOR, dostêpny dla danegokontekstu urz¹dzenia.Plik nag³Ã³wkowy117Rozdzia³ 4.* OpenGL for Windows: OpenGL + Win32 = WiggleSk³adnia Opisint ChoosePixelFormat(HDC hDC, const PIXELFORMATDESCRIPTOR *ppfd);Ta funkcja jest u¿ywana do wyznaczenia najlepszego formatu pikseli dostêpnegodla danego kontekstu urz¹dzenia.Wybór opiera siê na charakterystyceprzekazanej w strukturze PIXELFORMATDESCRIPTOR.Otrzymany indeks formatu jestprzekazywany funkcji SetPixelFormat.Parametry hDCPPfdZwracana wartoœæPrzyk³adHDC: Uchwyt kontekstu urz¹dzenia, dla którego funkcja wyszukuje najbardziejdopasowany format pikseli.PDCELFORMATDESCRIPTOR: WskaŸnik do struktury opisuj¹cej idealny ¿¹dany formatpikseli.Niektóre pola struktury s¹ zarezerwowane do wykorzystania wprzysz³oœci.Pe³ny opis struktury PIXELFORMATDESCRIPTOR zostanie podany przyopisie funkcji DescribePixelFormat.Tutaj opiszemy jedynie te pola, które s¹wykorzystywane przy wyborze formatu pikseli:nSize WORD: Rozmiar struktury, zwykle ustawiany nasizeof(PIXELFORMATDESCRIPTOR).nYersion WORD: Numer wersji struktury, ustawiany na 1.dwFlag DWORD: Zestaw znaczników okreœlaj¹cych w³aœciwoœci bufora pikseli.iPixelType BYTE: Tryb kolorów (RGBA lub indeksowany).cColorBits BYTE:G³êbokoœæ bufora kolorów.cAlphaBits BYTE: G³êbokoœæ bufora alfa.cAccumBitsBYTE: G³êbokoœæ bufora akumulacji.cDepthBits BYTE: G³êbokoœæ buforag³êbokoœci.cStencilBits BYTE: G³êbokoœæ bufora szablonu.cAuxBuffers BYTE: Iloœæ buforów pomocniczych (nieobs³ugiwane w implementacjiMicrosoftu).iLayerType BYTE: Rodzaj warstwy (nieobs³ugiwane w implementacji Microsoftu).Indeks formatu pikseli najbardziej zbli¿onego do przekazanego formatu lubwartoœæ zero, jeœli nie powiod³o siê wyszukanie zbli¿onego formatu.Kod przyk³adu GLRECT w tym rozdziale demonstruje wybór formatu pikseli:int nPixelFormat;static PIKELFORMATDESCRIPTOR pfd = {sizeof(PIXELFORMATDESCRIPTOR),// Rozmiar tejstrukturyl, // Wersja struktury118Czêœæ l * Wprowadzenie do OpenGLPatrz tak¿e// Wybranie formatu pikseli najbardziej zbli¿onego// do wskazanego w pfdnPixelFormat = ChoosePixelFormat(hDC, &pfd);// Ustawienie formatu pikseli dla kontekstu urz¹dzenia SetPixelFormat(hDC,nPixelFormat, &pfd);DescribePixelFormat, GetPixelFormat, SetPixelFormatDescribePixelFormatPrzeznaczenie Plik nag³Ã³wkowy Sk³adniaOpisZwraca szczegó³owe informacje o formacie pikseli.int DescribePixelFormat(HDC hDC, int iPixelFormat, UINT nBytes,LPPIXELFORMATDESCRIPTOR ppfd);Ta funkcja wype³nia strukturê PIXELFORMATDESCRIPTOR informacjami o formaciepikseli okreœlonym dla danego kontekstu urz¹dzenia.Zwraca tak¿e maksymalnyindeks formatu pikseli dla danego kontekstu urz¹dzenia.Jeœli ppfd ma wartoœæNULL, funkcja i tak zwraca maksymalny numer indeksu formatu pikseli dla danegokontekstu urz¹dzenia.Niektóre pola struktury PIXELFORMATDESCRIPTOR nie s¹obs³ugiwane w ogólnej implementacji OpenGL Microsoftu, mog¹ jednak byæobs³ugiwane przez poszczególnych producentów sprzêtu.Parametry hDCtPixelFormat nBytesppfdHDC: Uchwyt kontekstu urz¹dzenia zawieraj¹cego formaty pikseli.int: Indeksformatu pikseli, o którym chcemy otrzymaæ informacje [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • listy-do-eda.opx.pl