Utilizator:
Parola:
Am uitat parola... | Cont nou!


Articole Resurse Echipe Competiții Proiecte Forum DevBlogs Locuri de muncă GDROMag Issue#1 GDROCon 2007

 
Forum » Comunitate » Imaginea zilei » Mic demo OpenGL ES

Imaginea zilei:
» Mic demo OpenGL ES
Postat de JIM pe 22 Feb 2011 09:38:53 | Galeria "Imaginea Zilei"
Cateva imagini dintr-un proiect facut cu ocazia unui mic training de grafica acum 3 luni.

Proiectul este scris de la 0 in C++ folosind OpenGL ES, ceea ce inseamna ca in teorie este compatibil cu device-urile ce folosesc placute video PowerVR de generatie mai noua (iPhone 3GS sau mai nou).

Terenul este calculat dinamic (deformare, texturare, iluminare) in functie de un rendertarget.

Exista si valuri dinamice pe apa.
Reflexie in timp real pe apa.

Fun fact: Apa este facuta dintr-un singur poligon (2 triunghiuri).

Hacks:
  • Terenul foloseste precizie de 16 biti intr-o textura de 8bpp
  • Picking-ul este facut mostly din shader
  • Valurile interactioneaza cu terenul



Gasiti aici si 2 scurte filmulete cu aplicatia in actiune:

http://www.youtube.com/watch?v=65n_F-kNLsk
http://www.youtube.com/watch?v=Zizbk2e8vz0

Comentarii pentru aceste imagini:



Pagina 1 din 1 [ 1 ]

Mesaj Info autor
    Postat la 22 Feb 2011 11:06:23    Subiect: < fara subiect >
raduangelescu info:

raduangelescu:

Fun fact : Smile) cred ca am facut acelasi training


Afla mai multe pe: http://www.rageofwar.net


Status:
Înregistrat pe:
30 Sep 2006 09:43:25
Vârsta: ? ani
Mesaje: 32
Locatie: Bucharest

Evolution Vault (Iasi)
 
    Postat la 22 Feb 2011 13:34:22    Subiect: Re:
Black_Knight info:

Black_Knight:

raduangelescu a scris:

Fun fact : Smile) cred ca am facut acelasi training


ce training fratilor? descrieti si voi Wink mai ales ca vad ca va tot laudati acilea Wink

ce sa zic chiar misto demoul

PS: nu pot sa nu remarc cum de a crescut brusc activitatea zilele astea Smile


Status:
Înregistrat pe:
07 May 2007 19:49:43
Vârsta: 29 ani
Mesaje: 712
Locatie: Bucuresti
Programator

 
    Postat la 22 Feb 2011 13:35:45    Subiect: < fara subiect >
JIM info:

JIM:

Well, e vorba de training-ul pt. noi angajati de la Gameloft Smile


Intel i7 920 @ 4GHz, ASUS P6T, ATI 4870x2, 8GB DDR3 1600, Win7 x64


Status:
Înregistrat pe:
29 Apr 2007 22:20:51
Vârsta: 23 ani
Mesaje: 157
Locatie: Bucuresti
Programator

 
    Postat la 22 Feb 2011 13:40:40    Subiect: Re:
Black_Knight info:

Black_Knight:

JIM a scris:

Well, e vorba de training-ul pt. noi angajati de la Gameloft Smile


hmmm ce sa zic. multa bafta!
sper sa se fi schimbat lucrurile de cand am fost eu pe acolo (ca tester ce-i drept da am inteles ca nici restu nu o duceau extraordinar) oricum asta a fost cu muult timp in urma Wink


Status:
Înregistrat pe:
07 May 2007 19:49:43
Vârsta: 29 ani
Mesaje: 712
Locatie: Bucuresti
Programator

 
    Postat la 22 Feb 2011 14:19:20    Subiect: < fara subiect >
Pintea info:

Pintea:

Arata bine, probabil daca l-ai pune pe un telefon cu touch (fiindca spui ca e OGL ES) interactiunea ar fi interesanta.

Nu ai explicat insa deloc cum si ce ai facut, cel putin din categoria "Hacks" nu am inteles nimic, detaliaza pls Smile



Status:
Înregistrat pe:
05 May 2007 14:50:45
Vârsta: 29 ani
Mesaje: 301
Locatie:
Programator

 
    Postat la 22 Feb 2011 14:54:14    Subiect: < fara subiect >
JIM info:

JIM:

Ok, o mica detaliere.

Ce am facut in mare a fost sa scriu tot "engine"-ul din spate (spun "engine" pt. ca design-ul nu pot sa ma laud ca este excelent). Este destul de minimal dar are cateva lucruri care sa faca viata mai usoara (un CEntity, functii pt. pozitie/rotatie/scale, clasa pt. materiale s.a.m.d.).

Exemplu de cod:

Cod sursă:

MyTerrain = new CTerrain;
    MyTerrain->Load("..\Data\terrain3.tga");
    MyTerrain->Material.AddTexture(CTexture::LoadTex("..\Data\Grass3.tga"));
    MyTerrain->Material.AddTexture(CTexture::LoadTex("..\Data\Stone2.tga"));
    MyTerrain->Material.AddTexture(CTexture::LoadTex("..\Data\snow.tga"));
 


Nu e ceva miraculos, dar in fine.

Sectiunea de hacks:

Precizia terenului

Folosesc niste calcule in plus prin shader astfel incat in loc de un byte (1 canal de culoare din textura) folosesc 2 bytes si alcatuiesc din el o inaltime. In felul asta, cam dispar "scaritele" de pe teren.

Care era problema:

Cum terenul este calculat in timp-real si heightmap-ul este tinut intr-un FBO, in momentul in care desenez peste el cu un brush (pt. deformare) eroarea de precizie din brush se propaga direct proportional cu puterea efectului aplicat. Ex: Daca fac un varf inalt dintr-un teren plat o sa am scarite de sus pana jos in loc sa fie lin.

Picking

Pt. picking m-am chinuit cateva ore sa fac ceva mai normal. Citire din depth, intersectie de vectori cu terenul, etc. Nu mi-a iesit. Asa ca m-am gandit cum l-as putea face repede. Am gasit o metoda destul de usoara, dar imprecisa de a face chestia asta:

Se deseneaza teenul cu un shader special intr-un buffer (sau chiar pe ecran). Shader-ul respectiv, in pseudocod, face "output = position", adica incodeaza in culoarea de pe ecran pozitia din spatiu a respectivului pixel. Precizia de 8 biti e cam nasoala dar in cazul asta a mers. Odata desenat terenul, se citeste pixelul de sub mouse si se interpreteaza. Problem solved.

Valuri

Mai intai cateva cuvinte despre apa. Apa in aplicatia mea foloseste in principiu 3 texturi: normalmap, "effectsmap" si cubemap-ul pt. reflexie.

Effects map-ul este alcatuit in felul urmator:

Rosu - Sunt desenate/calculate valurile (adaptare pt. GPU la codul de aici: http://freespace.virgin.net/hugo.elias/graphics/x_water.htm )
Verde - Defineste unde este teren si unde este apa (folosita pt. coliziunea cu valurile)
Albastru - Un depth al terenului de sub apa, folosit doar pt. a adauga inca o textura la marginea apei (spuma, crengi, toxic waste or whatever one wishes) dar poate fi folosit si la altceva (refraction factor, etc.)

Codul de valuri din link functioneaza foarte bine la a reflecta valurile de marginile gridului. Asadar tot ce am facut ca sa reactioneze cu terenul a fost sa mai adaug conditia ca pixelul din "verde" sa fie "true".

Cum sunt un "real-time freak", am vrut ca totul sa fie in timp real/generat. Just because it's awesome Smile Asa a aparut calculul de teren/valurile/reflexia

De asemenea, pe cand eram tinerel si inca lucram la Ubisoft, am vazut un coleg care lucra la un sistem de apa pe CPU, si facea tot ce putea pt. a-l optimiza. Atunci i-am spus ca se poate si direct din textura, dar nu a fost prea incantat de idee. Asa ca am luat-o ca pe un challenge, dar nu am avut timp sa il incerc pana cand a aparut ocazia asta. Eu zic ca mi-a iesit binisor Smile


Intel i7 920 @ 4GHz, ASUS P6T, ATI 4870x2, 8GB DDR3 1600, Win7 x64


Status:
Înregistrat pe:
29 Apr 2007 22:20:51
Vârsta: 23 ani
Mesaje: 157
Locatie: Bucuresti
Programator

 
    Postat la 22 Feb 2011 17:10:50    Subiect: Re:
Pintea info:

Pintea:

JIM a scris:

Rosu - Sunt desenate/calculate valurile (adaptare pt. GPU la codul de aici: http://freespace.virgin.net/hugo.elias/graphics/x_water.htm )
Verde - Defineste unde este teren si unde este apa (folosita pt. coliziunea cu valurile)
Albastru - Un depth al terenului de sub apa, folosit doar pt. a adauga inca o textura la marginea apei (spuma, crengi, toxic waste or whatever one wishes) dar poate fi folosit si la altceva (refraction factor, etc.)

Codul de valuri din link functioneaza foarte bine la a reflecta valurile de marginile gridului. Asadar tot ce am facut ca sa reactioneze cu terenul a fost sa mai adaug conditia ca pixelul din "verde" sa fie "true".

Cum sunt un "real-time freak", am vrut ca totul sa fie in timp real/generat. Just because it's awesome Smile Asa a aparut calculul de teren/valurile/reflexia

De asemenea, pe cand eram tinerel si inca lucram la Ubisoft, am vazut un coleg care lucra la un sistem de apa pe CPU, si facea tot ce putea pt. a-l optimiza. Atunci i-am spus ca se poate si direct din textura, dar nu a fost prea incantat de idee. Asa ca am luat-o ca pe un challenge, dar nu am avut timp sa il incerc pana cand a aparut ocazia asta. Eu zic ca mi-a iesit binisor Smile


Ce pui tu in canalele verde si albastru nu poti obtine din textura de "picking" ? Cum ai un singur plan cu apa, terenul e acolo unde Y > 0, iar adancimea terenului e tot din marimea lui Y cand Y<0.

Pentru un sistem de apa pe CPU sunt niste puncte pro in caz ca apa nu e doar un plan si vrei sa calculezi fizica obiectelor ce plutesc pe ea, ai nevoie de o imagine dublata a apei in CPU/GPU.
La fel, daca ar fi sa faci coliziuni pentru terenul tau deformat tot ar trebui sa tii datele dublate.

Poate ne povestesti si cu texturarea Smile



Status:
Înregistrat pe:
05 May 2007 14:50:45
Vârsta: 29 ani
Mesaje: 301
Locatie:
Programator

 
    Postat la 22 Feb 2011 17:11:11    Subiect: < fara subiect >
Jinx info:

Jinx:

Arata foarte bine. Good job! Cool



Status:
Înregistrat pe:
03 May 2007 22:45:14
Vârsta: 20 ani
Mesaje: 753
Locatie: Pitești, Argeș
Game designer

 
    Postat la 22 Feb 2011 17:23:17    Subiect: Re:
JIM info:

JIM:

Jinx a scris:

Arata foarte bine. Good job! Cool


Thanks!

@Pintea: Stiu, sunt limitari. Cam tot ce e in demo-ul asta este limitat destul intr-un fel sau altul. Norocul face ca limitarile sa nu prea se afiseze aici in demo. Smile

Valurile au acum ca limitare faptul ca pt. terenul ala e nevoie de o textura destul de mare (2048x2048 in cazul de fata), dar probabil e valabil si cu CPU in cazul unei suprafete mari de apa.

Cat despre obiecte care plutesc... e posibil sa se poata face ceva in vertex shader pt. deplasarea obiectului in functie de inaltimea valului din normalmap.

Texturarea este destul de simpla. UV-ul se calculeaza ca un tile simplu, apoi se face o interpolare simpla intre cele 2 texturi (iarba/pamant) bazate pe componenta Y a normalei. (Y mai mare => suprafata plata => iarba. Y mai mic => suprafata in panta => pamant). Nu stiu daca a ramas in aplicatia finala, dar aveam si o a 3-a textura (zapada) care practic lua locul texturii de iarba in calculul de mai sus la inaltimi mari.

EDIT: Yep, puteam sa unesc verde cu albastru. Stiu ca am incercat la un moment dat dar nu mai tin minte ce nu mi-a placut. Also, verdele il foloseam si pt. un rejection (care pobabil era inutil din cauza testului de depth)

EDIT2: O mica aditie. Nu a fost totul scris "de la 0". A existat un header cu operatii pe matrici si incarcare de TGA.

Ultima editare efectuată de JIM pe 23 Feb 2011 17:53:53; 2 editări în total


Intel i7 920 @ 4GHz, ASUS P6T, ATI 4870x2, 8GB DDR3 1600, Win7 x64


Status:
Înregistrat pe:
29 Apr 2007 22:20:51
Vârsta: 23 ani
Mesaje: 157
Locatie: Bucuresti
Programator

 

Pagina 1 din 1 [ 1 ]


Server time: 07:18:12 22.05.2012



[ Termeni si conditii | Contact | F.A.Q. | Funny Pictures ]

© 2006 - 2012 Copyright 7thFACTOR Entertainment - All rights reserved