Egyszerű (de szép nagy) mátrix megjelenítés.

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.

Hozzászólások

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.

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)

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.