OpenGL Game Tutorial
Visual C++ 6.0



Sky Box 2 - vytváření oblohy a krajiny


Příklad a zdroják ke stažení (2 129k)

Trochu jsem zdokonalil předešlý příkládek na vytváření skyboxu. Použil jsem jinou fintu pro schování viditelných přechodů mezi čtverci skyboxu. Místo, abych posouval každý čtverec blíž ke kameře, jsem změnil texturovou koordinaci každého čtverce tak aby zmizeli bílé (v předešlé verzi černé) okraje. Tím pádem, můžu použít druhou fintu, která spočívá v tom, že před vykreslováním skyboxu vypnu depth buffer glDisable(GL_DEPTH_TEST) a po vykreslení skyboxu znova depth buffer zapínám glEnable(GL_DEPTH_TEST). Tím docílím toho, že skybox bude vždy za scénou (pokud skybox vykresluji dříve než scénu) a přitom může být skybox malej. V tomto případě má velikost 2x2x2. Scéna díky této technice může být veliká tak, jak si může vaše mašina dovolit.

Ještě pro textury skyboxu načítám větší formát obrázků 512x512 pixelů, čímž docílím detailnějšího vzhledu. Můžete použít i obrázky 1024x1024, nebo víc. To je pak paráda, akorát to chce lepší grafárnu.

Uvedu zde jen zdroják, který jsem měnil. Ostatní popis zdrojáku najdete v předešlém tutorialu

Jde vlastně o dvě změny. První je ve funkci InitSkyBox(), kde místo posouvání čtverců ke středu měnim texturovou koordinaci tak, aby zmizeli bílé okraje.

// Inicializuj Sky Box
void KObject::InitSkyBox(TPoint3d point0,                 // Texturová koordinace a pozice bodu 0
                         TPoint3d point1,                 // Texturová koordinace a pozice bodu 1
                         TPoint3d point2,                 // Texturová koordinace a pozice bodu 2
                         TPoint3d point3,                 // Texturová koordinace a pozice bodu 3
                         TPoint3d point4,                 // Texturová koordinace a pozice bodu 4
                         TPoint3d point5,                 // Texturová koordinace a pozice bodu 5
                         TPoint3d point6,                 // Texturová koordinace a pozice bodu 6
                         TPoint3d point7,                 // Texturová koordinace a pozice bodu 7
                         int      TextureListNumber0,     // Číslo Listu textury 0
                         int      TextureListNumber1,     // Číslo Listu textury 1
                         int      TextureListNumber2,     // Číslo Listu textury 2
                         int      TextureListNumber3,     // Číslo Listu textury 3
                         int      TextureListNumber4,     // Číslo Listu textury 4
                         int      TextureListNumber5,     // Číslo Listu textury 5
                         int      ObjectListNumber)       // Číslo Listu objektu

{
       // Nastav texturové koordinace, vymaž bílé okraje tím, že posuneš koordinaci o 0.005
       TPoint2d texcoord0, texcoord1, texcoord2, texcoord3;
       texcoord0.x = 0.995f;                        // Texturová koordinace bodu 0
       texcoord0.y = 0.995f;
       texcoord1.x = 0.995f;                        // Texturová koordinace bodu 1
       texcoord1.y = 0.005f;
       texcoord2.x = 0.005f;                        // Texturová koordinace bodu 2
       texcoord2.y = 0.005f;
       texcoord3.x = 0.005f;                        // Texturová koordinace bodu 3
       texcoord3.y = 0.995f;




       glNewList(ObjectListNumber,GL_COMPILE);      // Vytvoř Display List podle daného Object Display Listu


          // Čelní stěna krychle
          glBindTexture(GL_TEXTURE_2D, Texture1.TextureList[TextureListNumber0]);     // Nastav texturu podle daného Texture Display Listu
          DrawTriangleFan(texcoord0, point0,        // Texturová koordinace a pozice bodu 0
                          texcoord1, point1,        // Texturová koordinace a pozice bodu 1
                          texcoord2, point2,        // Texturová koordinace a pozice bodu 2
                          texcoord3, point3);       // Texturová koordinace a pozice bodu 3


          // Pravá  stěna krychle
          glBindTexture(GL_TEXTURE_2D, Texture1.TextureList[TextureListNumber1]);     // Nastav texturu podle daného Texture Display Listu
          DrawTriangleFan(texcoord0, point3,        // Texturová koordinace a pozice bodu 3
                          texcoord1, point2,        // Texturová koordinace a pozice bodu 2
                          texcoord2, point4,        // Texturová koordinace a pozice bodu 4
                          texcoord3, point5);       // Texturová koordinace a pozice bodu 5

          // Zadní stěna krychle
          glBindTexture(GL_TEXTURE_2D, Texture1.TextureList[TextureListNumber2]);     // Nastav texturu podle daného Texture Display Listu
          DrawTriangleFan(texcoord0, point5,        // Texturová koordinace a pozice bodu 5
                          texcoord1, point4,        // Texturová koordinace a pozice bodu 4
                          texcoord2, point6,        // Texturová koordinace a pozice bodu 6
                          texcoord3, point7);       // Texturová koordinace a pozice bodu 7

          // Levá stěna krychle
          glBindTexture(GL_TEXTURE_2D, Texture1.TextureList[TextureListNumber3]);     // Nastav texturu podle daného Texture Display Listu
          DrawTriangleFan(texcoord0, point7,        // Texturová koordinace a pozice bodu 6
                          texcoord1, point6,        // Texturová koordinace a pozice bodu 7
                          texcoord2, point1,        // Texturová koordinace a pozice bodu 0
                          texcoord3, point0);       // Texturová koordinace a pozice bodu 1

          // Horní stěna krychle
          glBindTexture(GL_TEXTURE_2D, Texture1.TextureList[TextureListNumber4]);     // Nastav texturu podle daného Texture Display Listu
          DrawTriangleFan(texcoord0, point7,        // Texturová koordinace a pozice bodu 7
                          texcoord1, point0,        // Texturová koordinace a pozice bodu 0
                          texcoord2, point3,        // Texturová koordinace a pozice bodu 3
                          texcoord3, point5);       // Texturová koordinace a pozice bodu 5

          // Dolní stěna krychle
          glBindTexture(GL_TEXTURE_2D, Texture1.TextureList[TextureListNumber5]);     // Nastav texturu podle daného Texture Display Listu
          DrawTriangleFan(texcoord0, point1,        // Texturová koordinace a pozice bodu 1
                          texcoord1, point6,        // Texturová koordinace a pozice bodu 6
                          texcoord2, point4,        // Texturová koordinace a pozice bodu 4
                          texcoord3, point2);       // Texturová koordinace a pozice bodu 2

       glEndList();                                 // Konec Display Listu skyboxu
}

Druhá změna je vypnutí depth bufferu glDisable(GL_DEPTH_TEST) před vykreslováním skyboxu a zapnutí depth bufferu glEnable(GL_DEPTH_TEST) po jeho vykreslení. Vše se děje ve funkci DrawSkyBox()

void KObject::DrawSkyBox(int ObjectListNumber)     // Vykresli Sky box
{
     glPushMatrix();                               // Začátek prostorové matice
       glTranslatef(Camera1.Position.x, Camera1.Position.y, Camera1.Position.z);   // Pohybuj skyboxem podle kamery
       glDisable(GL_DEPTH_TEST);                   // Vypni testování Depth Bufferu, aby byl skybox vždy na pozadí
       glCallList(ObjectListNumber);               // Vykresli List skyboxu
       glEnable(GL_DEPTH_TEST);                    // Zapni testování Depth Bufferu, aby scéna byla vždy před skyboxem
     glPopMatrix();                                // Konec prostorové matice
}

To je vše.
Děkuji DigiBen ovi, od kterého jsem si vypůjčil skybox obrázky.

Příště se konečně vrhneme na načítání objektů, nebo scén z formátu (*.ms3d) 3D editoru MilkShape




Home