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/
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.
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. :)
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;
Tuossa ei nyt lainkaan näy, kuinka piirrät kuvasi.
// 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;
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/
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.
No käytähän sitten sitä glDrawPixelsiä, joka on tuohon tarkoitettu, niin ei tarvitse enempää voivotella. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.