Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
yaqwsx
Založen: 25. 02. 2008 Příspěvky: 66
|
Zaslal: 4. září 2010, 13:13:20 Předmět: glSDL a antialiasing |
|
|
Ve svém programu potřebuju otáčet SDL_Surface. Původně jsem začal s předrotováváním surface pomocí SDL_gfx a ukládáním do vectoru. Program se postupně rozrůstal a nyní je již metoda předrotovávání paměťově neúnosná. Proto jsme sáhl po knihovně glSDl, která nahrazuje volání SDL voláními openGL. Díky tomu mám možnost rotovat real-time.
Při rotování měly sprity zbaté okraje - nebyl zapnutý anti-aliasing. Tak jsem jej zapl pomocí:
kód: |
glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); |
Nyní již rotované sprity vypadají přesně dle mych představ, jen se objevily "švy"(úhlopříčka v obdélníku) mezi jednotlivými polygony a okraje - viz screenshot.
Nevíte, jak tento jev odstranit? |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 4. září 2010, 14:22:28 Předmět: |
|
|
Hned 2. a 3. odkaz v Googlu po zadání GL_POLYGON_SMOOTH mi řekly, kde je problém. Tato funkce totiž vyhlazuje proti dosavadnímu obsahu v bufferu, takže je problém, když je objekt v jiném objektu. Oficiálním řešením je použít antialiasing - máš k dispozici 11 let staré rozšíření GL_ARB_multisample. Nebo bys musel polygony řadit ručně od nejvzdálenějšího. _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
yaqwsx
Založen: 25. 02. 2008 Příspěvky: 66
|
Zaslal: 4. září 2010, 20:56:15 Předmět: |
|
|
Díky; jako naschvál na toto jsme přišel 5 minut po odeslání postu. Bohužel se mi nedaří zakombinovat podporu pro multisampling do glSDL. Tutorial na NeHe jsem prokousal, ale nedaří se mi jej použít - konkrétně mám problém se získáním handle okna v glSDL, znovuvytvořením nového okna s podporou multisamplingu a jeho navrácením glSDL. Celé odpoledne si s tím lámu hlavu a nic ? celé OpenGL je pro mě úplně nové.
Předem děkuji za radu. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 4. září 2010, 22:20:44 Předmět: |
|
|
kedze je to SDL tak by malo stacit pred volanim SDL_SetVideoMode() zavolat
kód: |
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);//zapne AA
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);//chceme 4xAA
|
_________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
yaqwsx
Založen: 25. 02. 2008 Příspěvky: 66
|
Zaslal: 5. září 2010, 11:09:17 Předmět: |
|
|
Právěže nastavování parametrů přes SDL_GL_SetAttribute nefunguje. Proto jsme s emrkl na NeHe a pokusil a zaimplementování tutoriálu do inicializace okna. Jenže ze zdrojového kódu glSDL nejsem moc moudrý... |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 5. září 2010, 18:12:39 Předmět: |
|
|
Jestli nefunguje, tak máš aktuální verzi SDL.dll? A pokud ano, zkusil jsi to v nějaké OpenGL aplikaci? Jestli je to až probém glSDL. _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 5. září 2010, 18:33:36 Předmět: |
|
|
Nevím jak ty, ale mě multisampling ve SDL funguje... možná blbá otázka, ale nezapomněl jsi ho jen zapnout?
glEnable(GL_MULTISAMPLE_ARB)
PS: jinak by to chtělo větší screenshot, ať si na to nemusím brát mikroskop  |
|
Návrat nahoru |
|
 |
yaqwsx
Založen: 25. 02. 2008 Příspěvky: 66
|
Zaslal: 5. září 2010, 21:17:42 Předmět: |
|
|
To Nouma: To Ladis: Ano, v "normálním" SDL multisampling funguje. Problém je až při použití glSDL, které nahrazuje funkci SDL_SetVideoMode vlastní, která vytváří okno jinak.
Kdyžtak přiádám kód, kde se snažím nastavit multisamplig přes SDL:
kód: |
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
okno = SDL_SetVideoMode(800, 600, 24, flag | SDL_OPENGLBLIT);
glEnable(GL_MULTISAMPLE_ARB); |
K screenshotu - vybral jsem úmyslně malý výřez - momentálně toho nevykresluji mnoho a chyby se projevovaly hlavně v tom výřezu, tak ať zbyte scény neruší. |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 5. září 2010, 21:34:14 Předmět: |
|
|
Kouknul jsem se na zdrojáky, a glSDL_SetVideoMode volá SDL_SetVideoMode, jen používá vlastní bitovou vlajku pro detekci použití své verze SetVideoMode...
Já sice SDL či glSDL nepoužívám, ale vytvoření okna s multisamplem by ve tvém případě mělo vypadat asi nějak takhle:
kód: |
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); // třeba chleba
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
glSDL_SetVideoMode(800, 600, 32, flags | SDL_GLSDL) ;
A pak nezapomenout zapnout:
glEnable(GL_MULTISAMPLE_ARB); |
PS: Jak jsi zjistil že ten multisampling opravdu "nefunguje"? |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 5. září 2010, 23:38:06 Předmět: |
|
|
Pokud je glSDL opensource, tak si ho uprav pro sve potreby, jestli soucasna verze nepodporuje multisampling . _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 6. září 2010, 10:40:08 Předmět: |
|
|
Já bych ti doporučil multisample framebuffers - vyhneš se tím nepříjemnostem s SDL, což je také dobré řešení - jen jsi omezený obvykle na 4x antialiasing. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 6. září 2010, 12:21:51 Předmět: |
|
|
No podle mě je lepší upravit jeden-dva řádky v glSDL než používat něco, co nefunguje všude a má znatelný výkonostní propad (a ve výsledku by znamenalo více řádků kódu). _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 6. září 2010, 22:42:39 Předmět: |
|
|
Něco co nefunguje všude - OpenGL 3 už je stabilní standard, kde na všech kartách které jej podporujou by mělo být rozšíření k dispozici ... pravda někdo může namítat, že GL 3 kartu nemá ... ale dnes ji seženete pod 2 tis. Kč - takže námitka je to celkem hloupá (2 měsíce bez piva a hned je máš, případně nějaká malá prácička pro souseda).
To zpomalení je také zavádějící, 0.9ms není tolik (ano je to zpomalení, ale není až takové ... u GL_ARB_multisample jej budeš mít taky a pokud se chystáš na deferred renderer, tak stejně budeš potřebovat multisample fbo). _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 7. září 2010, 05:36:06 Předmět: |
|
|
to je pravda dnes je uz GL3==DX10 karta dost rozsirena. a stale je vyhoda OpenGL ze to nemusi pouzit hra a teda pojde stale aj bez toho. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 7. září 2010, 06:57:00 Předmět: |
|
|
Bavíme se tu o multisample fbo a přitom by zřejmě stačilo jen použít GL_NEAREST jako texture filter... dívali jste se na ten screenshot? Autor se sice ještě nevyjádřil jestli se mu podařilo ty artifakty odstranit, ale řekl bych že to je způsobené bilineárním/trilineárním filtrováním. Před rokem jsem řešil stejný problém (http://www.ceske-hry.cz/forum/viewtopic.php?p=18094&highlight=#18094), a to jak u Direct3D tak i pak OpenGL, a vyřešil jsem to tak že jsem prostě použil defaultní filtrování (takže žádný GL_LINEAR).
Offtopic: Já jsem včera zkoušel ten multisample fbo, a rozdíl oproti klasickému fbo byl asi -20 fps (vím že fps není moc věrohodná jednotka při takovém srovnávání, ale...), takže nic dramatického... A to mám historickou ATI X1650 (OpenGL v2.1), která by to ani nemněla podporovat, takže pohoda jazz  |
|
Návrat nahoru |
|
 |
|