|
Sky Box 2 - vytváření oblohy a krajiny
|
|
|
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