Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Pikselintarkka 2D

User137 [16.10.2007 22:57:37]

#

Onko muilla kokemusta pikselintarkan grafiikan teosta esimerkiksi OpenGL:llä? Tiedän kyllä että SDL olisi yksi keino mutta ei tuskin tarpeen.

Tuolla oli myös jotain muttei apua ollut:
http://www.mindcontrol.org/~hplus/graphics/opengl-pixel-perfect.html

Testissä pikseli blurraa ylös ja alas hitusen, kuvasta katoaa sininen reunus kokonaan vaikka keskellä oleva teksti näkyy suht oikein.

Erot näkee näissä kuvissa vasta zoomaamalla, ei sinänsä hirvittävää mutta jos jotain voi vielä tehdä paremmin? Ortho tilassa piirrän ja
glTranslatef(0,0.1,0);
on kutsuttu jotta näyttää edes hitusen paremmalta. Kahdessa kulmassa on myös punaisia pikseleitä testinä, Quadeina piirrettynä. Tekstuuri ja ikkuna molemmat 512x256.
Tekstuuri: http://i21.tinypic.com/qz2o2e.png
Ohjelmassa: http://i22.tinypic.com/6xuq7b.png

Tallensin tuon tekstuuridatan vielä glTexImage2D kutsun jälkeen BMP kuvaan ja se vastasi tarkalleen alkuperäistä PNG:tä pienine yksityiskohtineen.

Edit: Ja GL_NEAREST on siis tekstuurin filtterinä tuossa kuvassa, GL_LINEAR tuottaa lähes saman kuvan.

Metabolix [16.10.2007 23:17:26]

#

Eikö tosiaan toimi, jos otat glTranslate pois, asetat orthossa yksiköksi pikselin ja piirrät kuvan (0,0)-(512,256) tekstuurikoordinaateilla (0,0)-(1,1)? Toinen (ehkä jopa oikeampi) vaihtoehto on käyttää glDrawPixels-funktiota, jonka nimikin kertoo, että se tekee juuri toivomusten mukaan. :)

User137 [16.10.2007 23:29:51]

#

Ei toimi.

Tuossa vielä testikuvaa quadeilla
http://i21.tinypic.com/1057dli.png

procedure TnxCanvas.SetPixel(x, y: integer);
begin
  glBegin(GL_QUADS);
    glVertex2f(x,y);     glVertex2f(x,y+1);
    glVertex2f(x+1,y+1); glVertex2f(x+1,y);
  glEnd;
end;

// nxCanvas.Enable(0,0,ClientWidth,ClientHeight);
procedure TnxCanvas.Enable(X, Y, Width, Height: integer);
begin
  if nxInitialized then begin
    Enabled:=true;
    glMatrixMode(GL_PROJECTION);
    glPushMatrix;
    glLoadIdentity; gluOrtho2D(X,X+Width,Y+Height,Y);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix;
    glLoadIdentity;
    glTranslatef(0,0.1,0); // Hienosäätö (kenties korttikohtainen?)
    glDepthMask(false);
  end;
end;

// nxSetView(0,0,pnlScreen.Width,pnlScreen.Height);
procedure nxSetView(X, Y, Width, Height: integer);
begin
  if nxInitialized then glViewport(X,Y,Width,Height);
end;

Metabolix [17.10.2007 11:04:35]

#

Tuossa ei nyt lainkaan näy, kuinka piirrät kuvasi.

User137 [17.10.2007 12:27:57]

#

// Tekstuuri
nxCanvas.RectT(0,0,ClientWidth,ClientHeight);

// Pikselit päälle
for i:=0 to 10 do
  nxCanvas.SetPixel(i,i*2);
nxCanvas.SetPixel(511,255);
nxCanvas.SetPixel(510,254);
nxCanvas.SetPixel(508,252);

procedure TnxCanvas.RectT(x, y, width, height: integer);
begin
  glBegin(GL_QUADS);
    glTexCoord2f(0,0); glVertex2f(x,y);
    glTexCoord2f(0,1); glVertex2f(x,y+height);
    glTexCoord2f(1,1); glVertex2f(x+width,y+height);
    glTexCoord2f(1,0); glVertex2f(x+width,y);
  glEnd;
end;

User137 [17.10.2007 16:56:48]

#

Noh.. Tuohon nyt voi varmuudella sanoa ettei ongelma johdu koordinaateista. Se että pikseli blurraa ylös ja alas kertoo että siirtää ylös tai alas niin menee pieleen kumminkin. Vikaa pitäisi kai etsiä jostain asetuksista tai komennoista joita en tunne.

Esimerkkejä mitä on kokeiltu päällä ja pois:
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
glEnable(GL_POLYGON_SMOOTH);

EDIT: http://homepage.mac.com/arekkusu/bugs/gluOrtho2D_inexact.html
Update: It looks like this problem might be due to invariance in texture filtering, as allowed by the OpenGL spec. The blur manifests differently on different GPUs.

Metabolix [18.10.2007 09:56:10]

#

No käytähän sitten sitä glDrawPixelsiä, joka on tuohon tarkoitettu, niin ei tarvitse enempää voivotella. :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta