Igyekeztem a címben kellően összefoglalni azt, hogy mit is szeretnék. Tudom, hogy tldr-nek tűnik, de kééérlek, ha már itt jársz, olvasd el. Köszi!
Előszó: Sajnos nem nagyon van időm elmélyedni az OpenGL, és egyáltalán a grafikus programozás világában jelenleg, egyéb elfoglaltságok miatt. Már így is túl sokat olvastam (időt pazaroltam) ezzel az egésszel. Így most tényleg valami kezdőknek szánt iránymutatásra lenne szükségem.
A laptopomban (ThinPad T61) levő Intel x3100 kártya segítségével szeretnék OpenGL segítségével előállított képen élsimított vonalakat. A redbookot olvasgatva először is bosszankodok, hogy majd' minden bekezdés elején ott a "Note:", hogy az ebben a fejezetben leírt dolgok bizony lassan deprecated státuszban vannak.
A Google találatai elvezettek NeHe 46. leckéjéhez, amely egy igencsak windows-os beállítottságú, sok egyéb fájlt include-oló megoldásnak tűnik, és végül a letöltött windows-os binárist (wine-nal) futtatva csak nem lesz élsimítás.
Ezen a multisamplingon lovagolva a következőig jutottam (teles glxinfo kimenet):
[kalevala][kmarc][~][$] glxinfo | grep -i multisample
GLX_ARB_multisample, GLX_EXT_import_context, GLX_EXT_texture_from_pixmap,
GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer,
GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_import_context,
GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer,
GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_import_context,
GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer,
GL_ARB_half_float_vertex, GL_ARB_map_buffer_range, GL_ARB_multisample,
GL_EXT_framebuffer_multisample, GL_EXT_framebuffer_object,
Tehát úgy nézem, hogy nálam van ARB multisample kiterjesztés. Viszont a következő kódrészlet egyértelműen kiírja, hogy nulla darab sample bufferem van:
static GLint buf[1], sbuf[1];
glGetIntegerv (GL_SAMPLE_BUFFERS_ARB, buf);
printf ("number of sample buffers is %d\n", buf[0]);
glGetIntegerv (GL_SAMPLES_ARB, sbuf);
printf ("number of samples is %d\n", sbuf[0]);
Megmondom őszintén, nem is nagyon értem a glxinfo kimenetében szereplő GL*multisample-ök összefüggését, kapcsolatát.
Kérdéseim a következők:
- Van-e lehetőség bármilyen módon egyszerű élsimításra ezen a hardveren?
-- Az sem gond, ha lassú: jelenleg pontosan 162 poligon, és két lámpa mellett van rá szükségem.
- Accumulation bufferrel próbálkoztam, egy példa alapján eljutottam egy Gauss-szórásos tömb használatáig, azonban az előállított kép általában mozog is, ezzel a módszerrel pedig elmosódottá válik a mozgás. Esetleg ezirányú ötletnek is örülnék.
- 5191 megtekintés
Hozzászólások
UP! (1)
- A hozzászóláshoz be kell jelentkezni
Bár nem hiszem hogy sokat segítek vele, de hátha :-)
Én SDL-en keresztül így szoktam belőni az élsimítást:
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);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);
Hogy simán GL-en keresztül hogy kell, fogalmam sincs.
- A hozzászóláshoz be kell jelentkezni
Miért vetted ki a linket?
- A hozzászóláshoz be kell jelentkezni
Na jó, itt van :-)
Szóval a legutóbbi demónkkal ki lehet próbálni, hogy működik-e az élsimítás ezzel a kártyával:
- A hozzászóláshoz be kell jelentkezni
Engem az érdekel, miért vetted ki a linket :)
- A hozzászóláshoz be kell jelentkezni
Mert rájöttem, hogy igazából nem segítek vele.
- A hozzászóláshoz be kell jelentkezni
Hááát, köszi kedves csapattárs, de sajnos ez antialias-szal segfaultol.
- A hozzászóláshoz be kell jelentkezni
Linux alatt tapasztalataim szerint a vonalsimítás elég eseti jellegű (értsd: vagy működik, vagy nem).
Ati fglrx esetén például tudom, hogy csak kikapcsolt kompoziting esetén működik.
Ha az Intel x3100 kártyád modulja mefelelő, és az OpenGL leképződ minimum 1.3-as verziójú (ez utóbbi glxinfo kimenete alapján rendben van), akkor használhatod ezt:
glEnable(GL_MULTISAMPLE);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
glEnable(GL_POINT_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);
glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
Ebből a lényeg a multisample engedélyezése. A többi sor a leképzés pontosságának növelésére kéri a vezérlőt (amit az vagy teljesít, vagy nem).
Ez egyébként egy elég öreg módszer, amely ráadásul nem is ad túl szép eredményt (bővitménnyel sokkal szebben leképezhető, csak az macerásabb), viszont elméletileg minden kártyának támogatnia kellene.
Zavard össze a világot: mosolyogj hétfőn.
- A hozzászóláshoz be kell jelentkezni
Nos az a gond, hogy ez (nálam is kikapcsolt compiz mellett) nem működik, ahogy eredetileg is írtam a
glGetIntegerv (GL_SAMPLE_BUFFERS_ARB, buf);
printf ("number of sample buffers is %d\n", buf[0]);
glGetIntegerv (GL_SAMPLES_ARB, sbuf);
printf ("number of samples is %d\n", sbuf[0]);
0-kat ad vissza.
- A hozzászóláshoz be kell jelentkezni
Amiket lekérdezel, azok a bővitményekről szólnak. A fentebb írt megoldást az OpenGL 1.3 felett minden leképzőtől megköveteli, azonban a használt módszert és minőséget nem írja elő. Ez a módszer független a bővitményektől.
Minden olyan függvény, vagy tulajdonság, ami ARB, EXT, vagy gyártó név taggal végződik: bővítmény. A te esetetben a GLX_ARB_multisample bővítményről beszélsz, azonban az általam írt megoldás független ettől. A bővítmény egyébkét azért jelent meg, mert a gyártók az eredetileg implementált megoldásnál sokkal jobb módszerekkel által elő, azonban a lefele kopatibilitás megtartásának okán elkülönítve kezelik.
A bővítmények használhatóságát sok minden meghatározza. A legnagyobb probléma az, hogy egy bővitmény használatához be kell szerezned a bővítményben található függvények belépési pontját, illetve meg kell győzödnöd a kódodban, hogy a bővítmény rendelkezésre áll-e. Ha egy nem létező bővítményt megpróbál használni egy program, az az OpenGL állapot gépet hibás (ismeretlen) állapotba löki, illetve sokszor a program el is pukkan.
Sajnálatos módon a bővítmények kezelése platform függő. Windows alatt WGL, X kiszolgáló alatt GLX hívásokkal lehet csak elérni. Azon OpenGL API-k alatt, amelyek elrejtik a platform függő részeket (pl.: GLUT) nem lehet bővítméyneket használni (bár az eredeti glutnál tovább fejlesztett freeglut és openglut már kiküszöbölte ezt a problémát).
Ez egy elég jól használható leírás a bővítményekről, ha minden áron azokat akarod használni: http://developer.nvidia.com/object/opengl_extensions_tutorial.html .
A példa ugyan windowsra van írva, de gyakorlatilag csak le kell cserélni a wglGetProcAddress-t glXGetProcAddress-re. Bővítmények egyszerűbb kezelésre használhatod a GLEE-t (http://elf-stone.com/glee.php), bár sajnos már nincs karban tartva és vannak hibái. A bővítmények kezelése SDL alatt is működik, csak ne felejtsd el befűzni a GL/glx.h-t.
A konkrét bővítményt nem ismerem, így annak használatában sajnos nem igazán tudok segíteni. Általában kerülni szoktam a bővítmények használatát, mivel már a különböző OpenGL változatok közti eltérések lekezelése is elég problémát tud okozni számomra, amikor skálázható kódot kell írni (általában minden amit nem kifejezetten csak a saját gépünkön és csak akkor egyszer akarunk futtatni, az ebbe a kategóriába esik).
Zavard össze a világot: mosolyogj hétfőn.
- A hozzászóláshoz be kell jelentkezni
Köszönöm a tartalmas leírást, már most okosabb lettem a témába, mint tegnap ilyenkor :)
Bár több óra (nap) próbálkozással a Google nem tudott segíteni, mégis azt reméltem, hogy van valamiféle egyszerű módszer erre a (számomra) aprónak tűnő problémára. Namost ennyire - mint írtam - már nem tudok belemélyedni, így valószínáleg megelékszem az élsimítatlan változattal.
- A hozzászóláshoz be kell jelentkezni