Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 23. únor 2008, 21:42:21 Předmět: [c++] Prvni krucky v OpenGL |
|
|
Do tohohle vlakna bych chtel psat dotazy na problemy s psanim hry pod OpenGL a c++, tak jak se budou obevovat. Nechci dotazy psat do novych vlaken, protoze to budou spis utrzkovy dotazy.
Pro zacatek mam tyhle dotazy:
1. jak se resi transformace v OGL zatim vim jen o glRotatef/glTranslatef.... ,
ale ja bych spis potreboval pouzivat primo matice.
Dalsi problem se tyka spis navrhu a struktury enginu, zatim mam jen par trid, jako: Renderer, ten ospahuje pole textur, vertex a index bufferu.
pak mam tridu pro model, ktera nacte model ze souboru a posle vertexy a indexy do rendereru a dostane jejich ID, pri vykresleni si je v rendereru vybere a zavola renderer->draw. Nevim jestli je tenhle navrh "spravnej"....
3. posledni problem se tyka deleni prostoru, premyslim bud o BSP nebo Octree, zatim nevim co bude lepsi....
Pujde o zavodni hru, vlastne remake jedny hry z mrve platformy Amiga.
Hra nebude moct pouzivat VBO ani Shadery, planuju mozny port na platformu Pegasos, ktery pouziva TinyGL. ve hre asi nebude zadny okolni prostredi jako Stromy.... |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 24. únor 2008, 11:23:09 Předmět: |
|
|
0. Možná by Ti mohl pomoci odkaz nahoře na stránce, který směřuje na NeHe tutoriály.
1. glLoadMatrixf, glMultMatrixf apod.
2. Návrh bych koncipoval tak, že bych měl jednu třídu Device (stará se o vytvoření zařízení apod.), která by obsahovala instance těchto tříd: TextureManager (stará se o načítání a uvolňování textur - např. pomocí počítání referencí), MaterialManager (správa materiálů), ObjectManager (správa modelů), Camera, Renderer (pošleš mu kameru a objekty a on je vykreslí). Tohle je jen takovej nástřel, určitě si tam vymyslíš nějaký vychytávky...
3. Osobně bych šel spíš do Octree, příp. QuadTree. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 24. únor 2008, 13:02:55 Předmět: |
|
|
3) Zalezi od toho aky mas teren - ak to bude v podstate heightmapa, vystacis s quadtree, inak pouzi octree, je to celkom zadara (akurat budes mat problemy s polopriehladnymi trojuholnikmi, ktore sa ti dostanu jeden do viacerych listov - ak ich nebudes delit).
Tiez mozes pouzit BVH (Bounding Volume Hierarchy) nad AABB/OBB alebo niecim inym, dosiahnes podobne vysledky ako s Octree, pripadne kD-tree a podobne.
A rada co sa tyka podobnych akceleracnych struktur a tak vobec vseobecne: Nepouzivaj rekurziu!!! Zabije ti totalne vsetok vykon. Vpoho si to naprogramuj pomocou rekurzie, ale vo finale prepis s pouzitim zasobnika. (Prechod stromom a konstrukcia) _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 26. únor 2008, 20:12:49 Předmět: |
|
|
pcmaster napsal: |
A rada co sa tyka podobnych akceleracnych struktur a tak vobec vseobecne: Nepouzivaj rekurziu!!! Zabije ti totalne vsetok vykon. Vpoho si to naprogramuj pomocou rekurzie, ale vo finale prepis s pouzitim zasobnika. (Prechod stromom a konstrukcia) |
Tak to uplne nevim jak myslis, zatim vubec nemam predstavu, jak se takovy stromy resi.
Augi->2. Puvodne sem chtel mit jen renderer, ale asi to udelam tak, jak rikas. Uz sem to tak mnel v jednom docela slusnym projektu v C# a MDX. |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 26. únor 2008, 22:55:08 Předmět: |
|
|
Imho je to správný směr. Ten Renderer by vlastně neměl dělat nic jinýho, než že mu pošleš seznam objektů k vykreslení a on se sám postará o vyřazení objektů mimo záběr kamery, o vhodné seřazení objektů a nakonec o jejich vykreslení. Takže teoreticky by mohla být třída Renderer rozložena do těchto tří tříd, ale to je imho už trošku zbytečné (pokud teda neděláš supa-dupa-univerzální engine - nic proti, ja se na tomhle hodně naučil, i když praktický efekt je nulový). |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 13. březen 2008, 20:37:49 Předmět: |
|
|
Nejak tak to udelam.
Ale tedka mam jinej problem, zajimalo by mne jak se v OpenGL resi ruzny typy vertexu. Jestli mam udelat ruzny struktury pro texturovany vertex, obarveny.... Nebo jestli mam udelat ve strukture VertexBuffer, ruzny pole pro pozice, barvy... |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 13. březen 2008, 21:45:26 Předmět: |
|
|
Vertex buffer vždycky vytvořím podle toho, co mesh obsahuje. Podle mě vesměs nemá moc smysl řešit barvy, takže používám jen koordináty, normály + další vektory, pokud je efekt vyžaduje. Tohle všechno pak vložím prokládaně do jednoho bufferu, kde je velikost vertexu zarovnaná na násobek 16 nebo 32 bajtů. (někdy se ovšem doporučuje mít více vertex streamů (bufferů) na jeden model, prý je to rychlejší, závisí to na hw). Určitě budeš v budoucnu potřebovat různé druhy struktur pro vertex, takže buď připravenej na všechno a udělej to obecně.
Pokud se vydáš cestou "v jednom bufferu všechno prokládaně" (prokládaně znamená, že uložíš vždycky jednu pozici, jednu normálu atd. za sebe a pak od každého druhé atd.), pak jako offset do gl*Pointer zadáš jenom velikost atributů před normálou, tzn. pozice bude mít offset 0, normála bude mít sizeof(pozice) atd. (je třeba ten offset pak přetypovat na (char*) a zadat jako pointer, v případě použití VBO ale ukazuješ do VRAM, nicméně tam přímo ukázat nemůžeš, proto se zadává jenom offset od začátku tvého bufferu). Jako parametr stride pak zadáš velikost celé struktury vertexu.
Pokud se vydáš cestou "každej atribut v samostatném bufferu", je to o dost jednodušší. Všechno nahraješ do samostatnýho bufferu, offset (ten pointer) zadáš 0, stride zadáš 0 a jedeš.
Strukturu vertexu (jako FVF v D3D) v GL nijak nezadáváš, ten si ji sám určí podle toho, co všechno mu tam cpeš za atributy. To je určitě výhoda, ale zároveň i nevýhoda, protože ne všechny struktury vertexů jsou podporovaného hardwarem, ale když se budeš držet floatů, nemáš se čeho bát. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 17. březen 2008, 17:48:29 Předmět: |
|
|
Tak asi pouziju kazdy zvlast, shadery ani VBO tam mit nemuzu, takze pouziju vertexArrays. Akorat tedka fakt nevim jestli bude lepsi pouzit ColorPointer,.... nebo InterleavedArrays. No a pokud sem to spravne pochopil tak muzu bud ve vertexBufferu mit jedno pole struktur:
struct Vertex
{
float x, y, z;
float tx, ty;
.....
};
to by bylo to prokladany pole, nebo muzu ve VB pole normal, TexCoord, Normal...
Indexy mam ve zvlastnim bufferu, uz pro to, ze na model bude asi jen jeden VB a vic IB podle materialu, je to tak "spravne"? |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 24. březen 2008, 11:57:33 Předmět: |
|
|
Tak se mi tedka vyskytl takovej zajimavej problem. Udelal jsem vypisovani textu podle 17. nehe tutorialu, ale mam problem s vykreslenim textury, kdys nactu texturu a stejnou pouziju na ten text a na normalni Quad tak na quadu je vzdycky vertikalne prevracena. tady je kod na ten quad
glBegin(GL_QUADS);// Kreslení obdélníku
glTexCoord2d(0.0f,0.0f);
glVertex2f(-1.0f, 1.0f);
glTexCoord2d(1.0f,0.0f);
glVertex2f( 1.0f, 1.0f);
glTexCoord2d(1.0f,1.0f);
glVertex2f( 1.0f,-1.0f);
glTexCoord2d(0.0f,1.0f);
glVertex2f(-1.0f,-1.0f);
glEnd();[/code] |
|
Návrat nahoru |
|
|
Weny Sky
Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 24. březen 2008, 12:41:46 Předmět: |
|
|
A co takhle:
kód: |
glBegin(GL_QUADS);// Kreslení obdélníku
glTexCoord2d(0.0f, 1.0f);
glVertex2f(-1.0f, 1.0f);
glTexCoord2d(1.0f,1.0f);
glVertex2f( 1.0f, 1.0f);
glTexCoord2d(1.0f,0.0f);
glVertex2f( 1.0f,-1.0f);
glTexCoord2d(0.0f,0.0f);
glVertex2f(-1.0f,-1.0f);
glEnd(); |
|
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 24. březen 2008, 13:08:07 Předmět: |
|
|
Dik, sem nejak zil v presvedceni ze 0,0 je levej horni roh textury |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 24. březen 2008, 16:30:38 Předmět: |
|
|
Tak tu mam dalsi problem, tentokrat z jinyho soudku, jde o loader meshe ulozenyho v .LWO formatu. Zatim mam napsany jen nacitani vertexu a indexu a problem je prave v tech indexech, ono jich muze totiz na kazdej poly byt ruznej pocet 2,3,4 jenze ja nactu vsechny indexy do pole a nijak nerozlisuju kolik jich kterej poly ma, takze vysledek nic moc. Mne zajima jak se to obycejne resi, jestli mam grafikovi rict ze model musi byt jen z Trianglu, nebo jak?
Tady je funkce ktera se stara o nacitani:
kód: |
U4 LwoMeshLoader::ReadPOLS(U4 nbytes, Mesh *mesh, FILE *file)
{
U2 numvert, flags;
U4 nPols, bytesread = 0;
VX vx;
ID4 id;
int n;
IndexBuffer *ib = new IndexBuffer();
printf("POLS [%d]", nbytes);
bytesread = 0L;
nPols = 0L;
bytesread += ReadID4(id, file);
printf(" [%s]\n", id);
ib->indices = new GLuint[];
ib->size = sizeof(GLuint);
ib->iNumIndices = 0;
while(bytesread < nbytes)
{
bytesread += ReadU2(&numvert, 1, file);
flags = (0xfc00 & numvert) >> 10;
numvert = 0x03ff & numvert;
printf("\t[%d] NVERT[%d] FLAG[%02x] <", nPols, numvert, flags);
nPols++;
ib->indices = (GLuint *) realloc(ib->indices, nPols * numvert * sizeof(GLuint));
ib->iNumIndices += numvert;
for(n = 0; n < (int)numvert; n++)
{
bytesread += ReadVX(&vx, file);
ib->indices[((nPols - 1) * numvert) + n] = vx;
if(n+1 == numvert)
printf("%d>\n", vx);
else
printf("%d, ", vx);
}
}
mesh->AddSubset(ib);
if(bytesread != nbytes)
printf("??? %d != %d\n", bytesread, nbytes);
return(bytesread);
} |
|
|
Návrat nahoru |
|
|
ladik-BigBoss
Založen: 28. 07. 2007 Příspěvky: 162
|
Zaslal: 25. březen 2008, 15:16:38 Předmět: |
|
|
vetsinou se prave rekne grafikovi: dodavej lowpoly v trojuhelnicich.
jinak bys musel psat kod na triplovani a to je myslim zbytecne |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 9. duben 2008, 12:45:18 Předmět: |
|
|
Muze se nekdo podivat na ty offsety, jestli je mam spravne?
kód: |
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, 5*sizeof(float), vertices->vertices);
glTexCoordPointer(2, GL_FLOAT, 5*sizeof(float), (GLvoid *)(((char *)vertices->vertices) + 12));
glDrawElements(GL_TRIANGLES, meshSubsets[num].indexBuffer->iNumIndices,
GL_UNSIGNED_INT, meshSubsets[num].indexBuffer->indices);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
|
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 9. duben 2008, 20:21:43 Předmět: |
|
|
Zřejmě jo, ovšem otázka je, jak jsi to pole naplnil. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
|