OpenGL: Skybox
Vytvoření jednoduchého krychlového skyboxu v OpenGL a jeho potexturování. Texturami se v tomto článku nebudu více zajímat, protože to je rozhodně na mnohem delší psaní, ke kterému se vrátím v jiném článku.
Pro ty, co neví, co to skybox je: Pokud si modelujete nějakou scénu, kde chcete mít nebe nebo vzdálené hory či lesy, na které nikdy nedosáhnete, pak upotřebíte tento mini-tutoriál a použijete skybox.
Nejprve si samozřejmě vymodelujeme alespoň základní podobu scény, kde se chceme pohybovat. Může vypadat například podobně té, co je na obrázku:
Ale může být i mnohem primitivnější. Hlavní je, abychom věděli, kam až ona mapa sahá. Kolem ní vybudujeme skybox.
Jednoduše kolem scény vykreslíme čtverce (obdelníky), záleží zde jen na vás, jak chcete mít nebe vysoko. Pro názornější a lépe viditelnou ukázku jsem každému čtverci dal jinou barvu. Nezapomeňte hlavně na to, že normála čtverce vám musí směrovat dovnitř, nikoliv ven. Nebo může směrovat ven, ale musíte zapnout vykreslování i zadní stěny (vykreslování přední stěny, která by zde tedy směrovala ven, je zbytečné).
A nakonec si na čtverce přidáme textury, které si můžete buďto vytvořit nebo stáhnout. Vytváření není tak jednoduché, jak se na první pohled může zdát, protože vám musí do sebe zapadat všechny hrany stěn, které použijete. Pokud se vám nechce nic vytvářet nebo nevíte jak na to, pak není nic jednoduššího, než trochu googlit. Bohužel zřejmě nenajdete přesně takové textury, které pro svůj projekt potřebujete
Vypínání světel není při texturování zapotřebí, používám to jen ze zvyku.
Konečný výtvor může vypadat nějak takhle:
Nakonec ještě přikládám jednoduchý zdrojový kód k této části vašich programů:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
void skyBox(GLuint * textury){ glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); //front glBindTexture(GL_TEXTURE_2D, textury[1]); glColor3d(1.0, 0.0, 0.0); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3d( 10, -2, 10); glTexCoord2f(1.0, 0.0); glVertex3d(-10, -2, 10); glTexCoord2f(1.0, 1.0); glVertex3d(-10, 12, 10); glTexCoord2f(0.0, 1.0); glVertex3d( 10, 12, 10); glEnd(); // back //Zde by bylo obdobné kreslení čtverce a //texturování, pouze s jinými souřadnicemi. To platí i pro další 4 čtverce. // left …. // right …. // top …. // bottom …. glDisable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); } |
Závěr
Skybox určitě nemůže chybět v žádné hře či krajině, kterou v OpenGL tak snažně vytvoříte. Rozhodně to vypadá mnohem líp, něž kdyby kolem scény bylo jen černo či bílo. A pokud dobře vyberete, nikdo ani nepozná, že to v dáli, k čemu se snaží dojít, jsou pouze textury a ne nějaké 3D objekty.