[ Pobierz całość w formacie PDF ]
.5, 1.0); glVertex3f(0.0, TERRAIN_SIZE,0.0);for (i = 0; i < 4; i ++) {glTexCoord2f((float)i, 0.8);glVertex3fv(sky_top[i]); };glTexCoord2f(4.0, 0.8); glVertex3fv(sky_top[0]); glEnd(); };/** Przygotowanie oœwietlenia.*/glEnable(GL_LIGHTING);glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TROE);glEnable(GL_LIGHTO);glLightfv(GL_LIGHTO, GL_POSITION, sunpos); glLightfv(GL_LIGHTO, GL_DIFFUSE,suncolor); glLightfv(GL_LIGHTO, GL_AMBIENT, sunambient);if (Moving l l Drawing)glEnable(GL_COLOR_MATERIAL); elseglDisable(GL_COLOR_MATERIAL);Rozdzia³ 12.» Mapowanie tekstur_________________________________425/** Teraz teren.*/type = TerrainType[0];height = TerrainHeight[0];n = TerrainNormal[0];for (y = 0; y < (TERRAIN_SIZE - 1); y ++){last_type = -1;for (x • 0; x < TERRAIN_SIZE; x ++, type ++, height ++, n ++) {if (last_type 1= *type){ /** Jeœli zmienia siê typ terenu, zakoñcz istniej¹cy pasek* i wyzeruj parametry tekstury/koloru*/if (last_type != -1) glEnd();switch (*type){case IDCJ³ATER :if (Moving || Drawing)glColor3f(0.0, 0.0, 0.5); elseglcallList(WaterTexture); break; case IDC_GRASS :if (Moving l l Drawing)glColor3f(0.0, 0.5, 0.0); elseglCallList(GrassTexture); break; case IDC_ROCKS :if (Moving || Drawing)glColor3f(0.25, 0.25, 0.25); elseglCallList(RocksTexture); break; case IDC_TREES :if (Moving l l Drawing)glColorSf(0.0, 0.25, 0.0); elseglCallList(TreesTexture); break; case IDC_MOUNTAINS :if (Moving || Drawing)glColorSf(0.2, 0.1, 0.05); elseglCallList(MountainsTexture); break; };glBegin(GL_QOAD_STRIP); if (last_type != -1)426 ____________________________________ Czêœæ II » U¿ywanie OpenGL/** Zaczniemy od poprzedniego miejsca, aby nie by³o dziur*/glTexCoord2i (x * 2 - 2, y * 2);glNorma!3fv(n[-l] ) ;glVertex3f ( (GLfloat) (X - TERRAIN_EDGE - 1), heightt-1] , (GLfloat) (y -TERRAIN_EDGE) ) ;glTexCoord2i(x * 2 - 2, y * 2 + 2);glNorma!3fv(n[TERRAIN_SIZE - 1] ) ;glVertex3f( (GLfloat) (x - TERRAIN_EDGE - 1), height[TERRAIN_SIZE - 1],(GLfloat) (y - TERRAIN_EDGE + l ) ) ;};last_type = *type; >;glTexCoord2i(x * 2, y * 2);glNormal3fv(n[0] ) ;glvertex3f( (GLfloat) (x - TERRAIN_EDGE) ,height[0] ,(GLfloat) (y - TERRAIN_EDGE) ) ; glTexCoord2i(x * 2, y * 2 + 2) ;glNormal3fv(n[TERRAIN_SIZE] ) ; glVertex3f( (GLfloat) (x - TERRAIN_EDGE) ,height [TERRAIN_SIZE] ,(GLfloat) (y - TERRAIN_EDGE + D);};glEnd ( ) ; }; glPopMatrix () ;/** Gdy lecimy lub rysujemy, u¿ywamy podwójnego buforowania.* Jeœli trzeba, przerzuæ bufory*/glFinish ( ) ;if (Moving l l Drawing) SwapBuf fers (SceneDC) ;/** 'SaveBitmapFile () ' - Zapis wyœwietlanej sceny na dysku.*/voidSaveBitmapFile (void){char title[256], /* Tytu³ pliku */ filename[256] , /* Nazwa pliku */directory[256] ; /* Bie¿¹ca kartoteka */ OPENFILENAME ofn; /* Struktura oknadialogowego */ void *bits; /* Dane bitmapy na ekranie */ BITMAPINFO *info; /*Nag³Ã³wek bitmapy na ekranie */Rozdzia³ 12.» Mapowanie tekstur_________________________________427/** Zrzut ekranu.*/bits = ReadDIBitmap(sinfo);if (bits == NULL){DisplayErrorMessage("Nie powiod³o siê odczytanie obrazu z ekranu!");return; >;/** Wyœwietlenie okna dialogowego.*/strcpy(directory, ".");strcpy(filename, "bez nazwy.bmp");strcpyltitle, "");memset(sofn, O, sizeof(ofn));ofn.lstructsize = sizeof(ofn);ofn.hwndOwner = SceneWindow;ofn.lpstrFilter = "Bitmapy\0*.BMP\0\0";ofn.nFilter!ndex = 1;ofn.lpstrFile = filename;ofn.nMaxFile = sizeof(filename) - 1;ofn.lpstrFileTitle = title;ofn.nMaxFileTitle = sizeof(title) - 1;ofn.lpstrlnitialDir = directory;ofn.IpstrTitle = "Zapisz plik bitmapy";ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST lOFN_NONETWORKBUTTON;if (GetSaveFileName(Sofn)) { /** Zapis pliku na dysku.*/if (SaveDIBitmap(filename, info, bits))DisplayErrorMessage("Could not save to file \'%s\' -\n%s",filename, strerror(errno)); };/** Zwolnienie pamiêci i powrót.*/free(info); free(bits);428 Czêœæ II » U¿ywanie OpenGL* 'PrintBitmap()' - Wydruk wyœwietlanej sceny.*/voidPrintBitmap(void){void *bits; /* Dane obrazu */ BITMAPINFO *info; /* Nag³Ã³wek bitmapy *//** Zrzut ekranu.*/bits = ReadDIBitmap (sinf o) ;if (bits == NULL){DisplayErrorMessage ("Nie powiod³o siê odczytanie bitmapy ^z ekranu! ") ;return;/** Wydruk bitmapy.*/PrintDIBitmap (Scenewindow, info, bits);/** Zwolnienie pamiêci i powrót.*/free (info) ; free(bits) ;/** 'GetClockO1 - Czas, jaki up³yn¹³, w milisekundach.*/doubleGetClock(void){SYSTEMTIME curtime; /* Bie¿¹cy czas systemowy */GetSystemTime(icurtime);return (curtime.wHour * 3600.0 +curtime.wMinute * 60.0 +curtime.wSecond +curtime.wMilliseconds * 0.001);429Rozdzia³ 12.* Mapowanie teksturPodrêcznikglTexCoordPrzeznaczenie Plik nag³Ã³wkowy Sk³adniaOpisParametry s t rZwracana wartoœæ Przyk³ad Patrz tak¿eOkreœla wspó³rzêdne tekstury dla wielok¹ta, na który nak³adamy teksturê.void glTexCoordl {dfis}(TYPE s);void glTexCoordl {dfis}v(TYPE *s);void glTexCoord2{dfis}(TYPE s, TYPE t);void glTexCoord2{dfis}v(TYPE *st);void glTexCoord3 {dfis}(TYPE s, TYPE t, TYPE r);void glTexCoord3{dfis}v(TYPE *str);void glTexCoord4{dfis}(TYPE s, TYPE t, TYPE r, TYPE q);void glTexCoord4{dfis}v(TYPE *strq);Ta funkcja ustala bie¿¹ce wspó³rzêdne obrazu tekstury, dla jednego, dwóch,trzech lub czterech wymiarów.Na przyk³ad, parametry s i t odpowiadaj¹ poziomeji pionowej wspó³rzêdnej dwuwymiarowego obrazu tekstury.Pozioma wspó³rzêdna obrazu tekstury.Pionowa wspó³rzêdna obrazu tekstury.Wspó³rzêdna g³êbokoœci obrazu tekstury.Wspó³rzêdna „czasu" obrazu teksturyBrak.Przejrzyj kod programu TEXSCENE.C na p³ytce CD-ROM.glTextEnv, glTexGen, glTex!magelD, glTex!mage2D.glTexParameterglTexEnvPrzeznaczenie Plik nag³Ã³wkowy Sk³adniaOkreœla parametry teksturowania.void glTexEnvf(GLenum target, GLenum pname, GLfloat param);void glTexEnvfv(GLenum target, GLenum pname, GLfloat *param);void glTexEnvi(GLenum target, GLenum pname, GLint param);void glTexEnviv(GLenum target, GLenum pname, GLint *param);430Czêœæ II * U¿ywanie OpenGLOpisFunkcja glTexEnv ustawia parametry mapowania tekstury, steruj¹ce sposobemnak³adania obrazów tekstur na wielok¹ty.W trybie teksturowania GL_DECAL obraztekstury jest bezpoœrednio nak³adany na wielok¹ty.W trybach GL_BLEND iGL_MODULATE przy wyznaczaniu docelowego koloru piksela uczestnicz¹ tak¿e ju¿narysowane piksele oraz kolor ustawiony parametrem GL_TEXTURE_ENV_COLOR.Parametry targetpname paramZwracana wartoœæ Przyk³ad Patrz tak¿eGLenum: Definiowane œrodowisko teksturowania, musi nim byæ GL_TEXTURE_ENV.GLenum: Nazwa definiowanego parametru.Dostêpne parametry to:GL_TEXTURE_ENV_MODE Okreœla tryb teksturowania.GL_TEXTURE_ENV_COLOR Okreœlakolor do po³¹czenia z tekstur¹Wartoœæ parametru.Dla parametru GL_TEXTURE_ENV_COLOR param jest wskaŸnikiem dowartoœci koloru RGBA.Dla parametru GL_TEXTURE_ENV_MODE mo¿e byæ jedn¹ zponi¿szych sta³ych:GL_DECAL Obraz tekstury jest bezpoœrednio nak³adany na wielok¹t.GL_BLEND Przed na³o¿eniem na wielok¹t, obraz tekstury jest mieszany zokreœlonym kolorem (GL_TEXTURE_ENV_COLOR).GL_MODULATE Przed na³o¿eniem na wielok¹t, obraz tekstury jest mno¿ony przezistniej¹cy obraz w buforze ramki.Brak.Przejrzyj kod programu TEXSCENE.C na p³ytce CD-ROM.glTexCoord, glTexGen, glTex!magelD, gITex!mage2D.glTexParameterglTexGenPrzeznaczenie Plik nag³Ã³wkowy Sk³adniaOpisDefiniuje parametry generowania wspó³rzêdnych tekstur [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • rurakamil.xlx.pl
  •