Autor Wątek: DirectX i wektory  (Przeczytany 3748 razy)

Offline Ishikawa

  • Użytkownik

# Październik 23, 2008, 21:26:49
Ok, więc pisze Engine 3D. Jest sobie klasa IRenderer. Z niej, wiadomo, dziedziczyć ma OGLRenderer, DXRenderer, etc. Mam też własną klasę wektorów, opisujace polozenie obiektow w przestrzeni etc. Każdy węzęł sceny podaje renderowi tymi wektorami swoje wspolrzedne.. tylko tu jest problem. DirectX, czy OpenGL, co oczywiste uzywaja innych klas do przedstawiania wspolrzednych. Mam swoja klase konwertowac, do directowych vectorow? Malo to eleganckie. Silnik powinien byc niezalezny od renderera. Jak sobie z tym poradzono w innych silnikach?

Pozdrawiam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Charibo

  • Redaktor

# Październik 23, 2008, 21:31:25
Cytuj
Jest sobie klasa IRenderer. Z niej, wiadomo, dziedziczyć ma OGLRenderer, DXRenderer, etc.
Nie baw się w pierdoły. I tak nie skorzystasz z dwóch rendererów (że już o software nie wspomnę). Zajmij się jednym API, tym które znasz lepiej. Nie ma sensu implementować czegoś żeby było ładnie, jeśli nie jest faktycznie potrzebne. :)

Cytuj
DirectX, czy OpenGL, co oczywiste uzywaja innych klas do przedstawiania wspolrzednych. Mam swoja klase konwertowac, do directowych vectorow?
Oba API nie używają żadnych klas do tego, a jedynie trzech zwykłych floatów. :) Przecież wektor to tylko dwie/trzy/cztery liczby, więc starczy napisać sobie operator który załatwi ci konwersję i używać jak masz ochotę. :)


poopa

  • Gość
# Październik 23, 2008, 21:33:05
Cytuj
Jak sobie z tym poradzono w innych silnikach?

Zastosowano tylko jeden? Po co pisać i pod OGL i pod DX?

Offline Khaine

  • Użytkownik

# Październik 23, 2008, 22:49:42
Cytuj
Zastosowano tylko jeden? Po co pisać i pod OGL i pod DX?
bo ktos chce miec cross-platform?


Cytuj
DirectX, czy OpenGL, co oczywiste uzywaja innych klas do przedstawiania wspolrzednych. Mam swoja klase konwertowac, do directowych vectorow? Malo to eleganckie. Silnik powinien byc niezalezny od renderera. Jak sobie z tym poradzono w innych silnikach?
a moze unia?


poopa

  • Gość
# Październik 23, 2008, 23:00:46
otwierasz nagłówek d3dxmath9.h czy 10 i kopiuj wklej robisz do własnego nagłówka, zmieniasz nazwę jeśli chcesz(bo panowie z microsoftu się dowiedzą że użyłeś części ich nagłówka) czy dopisujesz jakąś własną nazwę jako typedef. Czy w ogóle defniujesz inaczej macierz jeżeli to DX czy OGL.
Przykład użycia...
#ifdef DX
  typedef D3DXVECTOR3 MyFloat3;
#endif
#ifdef OGL
  struct MyFloat3
  { float x, y, z};
#endif
int DrawOurMightyHero(MyFloat3* pos);

//Albo
#ifdef OGL
  #define DrawOurMightyHero(pos) DrawOurMightyHeroOGL(MyFloat3* pos);
#endif  // Czy tam #else
#ifdef DX
  #define DrawOurMightyHero(pos) DrawOurMightyHeroDX(MyFloat3* pos);
#endif
int DrawOurMightyHeroOGL(MyFloat3* pos);
int DrawOurMightyHeroDX(MyFloat3* pos);
Albo linkujesz do dwóch różnych DLL-ów w  zależności od potrzeby....

Kurcze, w trakcie pisania tego posta z 6 sposobów na to mi się znalazło...

Oczywiście na razie to sobie odstaw tak jak sugerują "koledzy" (takie partyjne to powiedzenie)... Niepotrzebnie zaczniesz brudzić kod typedef-ami czy różnymi #include-ami, #define-ami...

Offline Charibo

  • Redaktor

# Październik 23, 2008, 23:55:54
Cytuj
Cytuj
Zastosowano tylko jeden? Po co pisać i pod OGL i pod DX?
bo ktos chce miec cross-platform?
Co ma DX do "cross-platform"? ;)

Cytuj
otwierasz nagłówek d3dxmath9.h czy 10 i kopiuj wklej robisz do własnego nagłówka, zmieniasz nazwę jeśli chcesz(bo panowie z microsoftu się dowiedzą że użyłeś części ich nagłówka) czy dopisujesz jakąś własną nazwę jako typedef. Czy w ogóle defniujesz inaczej macierz jeżeli to DX czy OGL.
Ale po co kombinować takie brzydkie chaki? Robimy sobie klasę wektora, operator konwersji i używamy tak jak D3DXVECTOR3 dla DX i jako float3 dla OpenGL. Dodatkowo nie tracisz nic z tych mighty optymalizacji Directa, bo funkcje D3DXVec3BlaBla tak czy siak przyjmują D3DXVECTOR3 jako parametr. :)
« Ostatnia zmiana: Październik 23, 2008, 23:57:38 wysłana przez Charibo »

poopa

  • Gość
# Październik 24, 2008, 00:09:16
Chyba khaki  ;).

Znalazłeś siódme rozwiązanie. Z drobnym narzutem samej konwersji. Ale mogę się mylić.

Brzydkie... to są nagłówki DX-a.

Offline skoti

  • Użytkownik

# Październik 24, 2008, 00:56:13
Co ma DX do "cross-platform"? ;)
Może ktoś myśli o szerszym rozumieniu "cross-platform" niż pc only (ps3, xbox, windows, linux i macos ;p).
« Ostatnia zmiana: Październik 24, 2008, 00:58:37 wysłana przez skoti »

poopa

  • Gość
# Październik 24, 2008, 02:00:39
Cytuj
Nie baw się w pierdoły. I tak nie skorzystasz z dwóch rendererów (że już o software nie wspomnę)
Jest mnostwo silnikow ktore wspieraja OGL'a, DX'a i pewnie jeszcze jakies inne rendererki, tak wiec na pewno nie sa to pierdoly. Poza tym cos takiego ma duzy walor edukacyjny. Sam opakowalem u siebie obydwa rendereki i jestem bardzo zadowolony, ze udalo mi sie pogodzic drobne rozbieznosci miedzy tymi API.
A jesli nie mowimy tylko o walorach edukacyjnych...
DX - 90% graczy to gracze Windows'owi. Z DX'em mam 99% pewnosci ze silnik pojdzie pod tym systemem bez problemow.
OGL - "szanuje" w ten sposob uzytkownikow innych systemow niz Windows. I generalnie moglbym pozostac tylko przy tym rendererze, ale niestety bywaja z nim duzo wieksze problemy jesli idzie o kombatybilnosc z roznymi kartami niz ma to miejsce w przypadku DX'a

poopa

  • Gość
# Październik 24, 2008, 03:09:03
maxest:
Że zapytam - jak shadery zapodajesz?
Osobno dla każdego API czy stworzyłeś jakiś kompilatorek wyższego poziomu... mhihi. No po prostu nad tym myślałem i myślę dalej że define-ami i includami znowu by się dało... więc zabierałeś się za tą stronę tego bałaganu? Może masz jakieś doświadczenia, którymi byś się mógł podzielić publicznie?

Offline skoti

  • Użytkownik

# Październik 24, 2008, 06:14:34
maxest:
Że zapytam - jak shadery zapodajesz?
Osobno dla każdego API czy stworzyłeś jakiś kompilatorek wyższego poziomu... mhihi. No po prostu nad tym myślałem i myślę dalej że define-ami i includami znowu by się dało... więc zabierałeś się za tą stronę tego bałaganu? Może masz jakieś doświadczenia, którymi byś się mógł podzielić publicznie?
Przecież jest język CG (to ten sam język co HLSL w DX, tylko wieloplatformowa implementacja dla dx i ogl) - zresztą wczoraj została opublikowana nowa wersja ;p

Offline Charibo

  • Redaktor

# Październik 24, 2008, 11:26:06
Cytuj
(ps3, xbox, windows, linux i macos ;p).
Sądzę, że jeśli ktoś byłby właścicielem na tyle dużej firmy, że Sony i Microsoft zgodzą się sprzedać mu devkity, to nie zadawałby pytań na tym forum. ;)

Cytuj
Jest mnostwo silnikow ktore wspieraja OGL'a, DX'a i pewnie jeszcze jakies inne rendererki, tak wiec na pewno nie sa to pierdoly.
"Na świecie jest mnóstwo Porsche czy Lamborghini. Sprzedam dom i nerkę, ale kupię sobie takiego - będę miał czym wozić siano codziennie z pola". ;)

poopa

  • Gość
# Październik 24, 2008, 14:14:47
Cytuj
Że zapytam - jak shadery zapodajesz?
Jak napisal skoti - uzylem Cg.

A jesli idzie o define'y i include'y to tych mam sporo :). Sposrod kilku mozliwych wariantow projektu rendererka wybralem taki, ze oddzielnie generowany jest kod dla OGL i oddzielnie dla D3D. Tak wiec przykladowa deklaracja naglowka np. klasy CVertexBuffer wyglada tak:
class CVertexBuffer
{
friend class CRenderer;

private:
#ifdef RNDR_D3D
IDirect3DVertexBuffer9 *id;
#else
unsigned int id;
#endif

int size;
BufferType bufferType;

public:
void init(int size, BufferType bufferType);
void free();

int getSize();

void map(void *&data);
void unmap();
};
Takie podejscie ma swoje zalety jak chocby to, ze mamy 100% pewnosci, ze w D3D'owym kodzie nie ma nic OGL'owego i vice-versa. Podobne podejscie zastosowano przy Assassin's Creed, gdzie byly dwa rozne exe'ki dla D3D9 i D3D10

poopa

  • Gość
# Październik 24, 2008, 20:28:07
A czytałem że CG ma problemy z kartami ATI - ale to pewnie przypadek. :P

Offline Khaine

  • Użytkownik

# Październik 24, 2008, 20:34:29
Cytuj
Co ma DX do "cross-platform"?
w sumie tyle, ze na linuxie odpalamy implementacje opengl'owa naszego renderera