Sziasztok!
Van egy egyszerű problémám. Adott egy nagy tömb amiben lényegében fényesség értékek vannak. (Maximálisan 16K*16K) méretüek. Ezt kell nekem képként ábrázolnom. A gondom az, hogy amit eddig írtam csiga lassú (semivel nem gyorsabb mint sima képként kirakni, pedig ebben zoomolgatni, és mozogni kellene majd), sokkal kisebb képek esetén is lassú (2048x2048 lesz a legkisebb képem). Gyanítom a pár órány opengl tudásom a probléma, a gonom az, hogy az opengl valami hastalmas dolog, abban kérnék a hozzáértőktől iránymutatást, hogy ezzel a problémával merre induljak. Edig ezt raktam össze, a probléma nagyon egszerű, csak az adaok száma hatalmas. Ehez egy közepes videokártya tudása elég? ( GF116 [GeForce GTS 450 Rev. 2] ).:
szerk:
Itt a kód volt de vacakul jelent meg úgyhogy pastebin link:
http://pastebin.com/B4YzACb6
Előre is köszönöm a segítséget.
- 2206 megtekintés
Hozzászólások
Nagyon régen foglalkoztam grafikával (és opengl-lel egyáltalán nem), de emlékeim szerint nagyon lassú dolog pixelenként rajzolni. Gyorsabb lesz, ha összerakod a bitmapet előre a memóriában, és megkéred a opengl-t hogy rakja ki.
Gyors google eredménye:
https://www.opengl.org/sdk/docs/man2/xhtml/glBitmap.xml
https://www.opengl.org/sdk/docs/man2/xhtml/glDrawPixels.xml
- A hozzászóláshoz be kell jelentkezni
Köszönöm, utánanézek.
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.
- A hozzászóláshoz be kell jelentkezni
Erre alkalmas szoftverek vannak készen. Azok nem jók?
- A hozzászóláshoz be kell jelentkezni
Az a helyzet, hogy be kellene építeni, a programomba.
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.
- A hozzászóláshoz be kell jelentkezni
A VisIT például tud olyant, hogy egy külső program által átadott/frissített adatokat jelenít meg akár 3D-ben. Így se jó?
- A hozzászóláshoz be kell jelentkezni
Első körben ha a glBegin-t és glEnd-et a külső ciklus köré raknád, már azzal is gyorsulna valamennyit, de szerintem úgy sem lenne elég gyors. Tekintve, hogy zoomolni is akarsz, én egy textúrába raknám a képet, és azt jeleníteném meg. Nem is kell azt pixelenként felépíteni, a gl_matrix-ból kapásból tudsz textúrát gyártani, csak ne GL_RGB, hanem GL_LUMINANCE módot adj meg.
- A hozzászóláshoz be kell jelentkezni
Mennyire updatelődnek ezek a "fényesség" értékek? Egy statikus dologról van szó?
Egyébként az egész koncepcionálisan rossz.
GL_POINTS esetén minden egyes glVertex2f külön külön átmegy a teljes raszterizálási folyamaton, ráadásként a teljes folyamat 90% tökéletesen felesleges a számodra, szóval nem csoda hogy baromi lassú, ráadásként feleslegesen túl sok vertex-et tolsz bele a pipeline-ba.
Első körben fel kell darabolnod az egészet a legnagyobb támogatható textúra méretre. A támogatott max textúra méretet következő módon tudod lekérdezni:
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &intPointer);
Ha megvan hogy hány darab x,y darabod van, igényelsz a driver-től megfelelő mennyiségű texture slot-ot, így:
glInt textures[slices_x][slices_y];
glGenTextures(slices_x * slices_y, &textures);
Majd feltöltöd a textúrákat a videókártya memóriájába, valahogy így:
for (tex_x = 0; tex_x < slices_x; tex_x++) {
for (tex_y = 0; tex_y < slices_y; tex_y++) {
// ide majd megírod te a kódot hogy létrehozd és feltöltsd a data az értékeiddel
char *data;
// csatoljuk a slot - ot a texture unit-hoz
glBindTexture(GL_TEXTURE_2D, textures[tex_x][tex_y]);
// feltöltjük a textúrát, egy texture channelt használva
glTexImage2D(GL_TEXTURE_2D, 0,GL_RED, width, height, 0, GL_R8, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
}
Kirajzolásnál pedig valami hasonlót kell alkodnod:
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
for (tex_x = 0; tex_x < slices_x; tex_x++) {
for (tex_y = 0; tex_y < slices_y; tex_y++) {
glBindTexture(GL_TEXTURE_2D, textures[tex_x][tex_y]);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(0, 0, 0);
glTexCoord2f(0, 1);
glVertex3f(0, 1, 0);
glTexCoord2f(1, 1);
glVertex3f(1, 1, 0);
glTexCoord2f(1, 0);
glVertex3f(1, 0, 0);
glEnd();
}
}
Ez persze csak egy baromi erős vázlat, sajnos a fixed pipeline betegségeire már hála égnek nem emlékszem, de ha eljutottál idáig akkor majd haladunk tovább az eredményben:)
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
Szia!
Először is köszönöm, a segítséget, kezdem érteni mit kell csinálnom. Azóta legalább 3-4 szeresére nőtt az opengl tudásom, már legalább 8-10 óra :) Na a helyzet az, hogy ezek az értékek úgy skálázódnak, hogy eg minimum alatt fekete egy maximum fölött fehér a között pedig líneárs vagy loagritmikus skála (Ez adatrögzítéskor meg is történik). Mérése válogatja. Nagyon köszönm a segítséget, ismételten.
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.
- A hozzászóláshoz be kell jelentkezni
Akkor az adat fix, a vizualizációja változik. Ebben az esetben még a GLSL Fragment Shader-t tudom a figyelmedbe ajánlani, mert akkor a textúrák frissítése nélkül valós időben tudod ezeket a dolgokat befolyásolni
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni