Šta je novo?

Kako spojiti Direct3D i OpenGL u jedno

genuine

Slavan
Učlanjen(a)
17.02.2006
Poruke
1,906
Poena
350
Imam sledeci problem.. treba napraviti program koji omogucava renderovanje 3d modela ili u OpenGL ili u Direct3D pri cemu korisnik na pocetku izabere koji ce graficki sistem da koristi....

razmisljao sam o abstract factory kao jedan nacin i bridge kao drugi (stim sto mi bridge malo komplikuje jer ne mogu lako da spojim "interfejse" opengl-a i direct3D u jedno... jel imao neko iskustva slicne prirode
 
Evo kako sam ja to resio : napravis 2 dll-a koji exportuju iste funkcije ( npr. InitGraphic() tako da u oba realizuju istu funkciju samo sa razlicitim GAPI-jem. - OpenGl ili Direct3D) a onda ih u programu zavisno od izbora korisnika dinamicki ucitas - funkcija LoadLibrary . Pokupis pointere na funkcije ( GetProcAddress funkcija ) i to je to. Ovo je (koliko znam) sistem koji se koristi u programima za kreiranje plug-ina a koriscen je i u Quake2 za razlicite renderere. Sve funkcije mi vracaju void* ( recimo TextureManager->GetTexture() a kada posaljem nazad u renderer isti pointer ( recimo Renderer->SetTexture(void* p) interno ga castujem u Direct3DTexture ili recimo CTexture u OpenGL-u. Sve ovo dobro radi, cak sam koristio Direct3DX funkcije za rad sa matricama i vektorima pod opengl-om :) (mrzelo me da pisem nove klase, mada je to bolje resenje ). Ako u necemu gresim - ispravite me.
 
Samo vodi racuna da OpenGL koristi right-handed koordinatni sistem, a D3D left-handed. To znaci da moras da usvojis jedan od ova 2 sistema pa da po potrebi konvertujes transformacije i orijentacije trouglova u zavisnosti koji rendering sistem koristis.
 
Poslednja izmena:
Jao znam.. i meni je pala na pamet ta ideja sa void* i slicno .. sto je nagore to sam i uradio ali mi je bilo tako ruzno ( u sustini na visem nivou se i ne vidi ) ali opet...

Sta mislite o varijanti na primer:
napravi se apstraktna klasa shader i iz nje se izvedu directXshader i openglshader i napravi se apstraktna klasa kreator koja ima apstraktnu metodu createShader .. apstraktnog kreatora nasledjuje openglkreator i directxkreator koji konstruisu objekte tipa shader i vracaju korisniku... na primer:

Creator *creator = new OpenGLCreator(blabla itd...); ili mozda jos bolje
Creator *creator = OpenGLCreator::getInstance() ;

u nastavku koda nemam pojma koji sistem korisitim jer koristim pokazivace na apstraktnu klasu... (sto je dobro)

Shader *shader = creator->createShader(blabla....);

sta ne valja sa ovim pristupom? posto ne bih da otkrijem sam posle dva meseca.. :))
 
Vrh Dno