OpenGL 2D problema

Sziasztok!

Egy 2D animaciot rajzolo programot irok. A pixelenkent szeretnem kirajzolni a kepeket, de ez valamiert nagyon nem mukodik:

http://postimg.org/image/whf4h7ovj/

Nincs egy tippetek arra, hogy ez miert igy nez ki? Pixelmeretet 1.0-re allitottam.
Esetleg lehet, hogy az ilyent nem OpenGL-el kellene keszitenem?

Hozzászólások

Kodot kene latni, ezt a pixelmeretet 1-re allitottam meg nem igazan ertheto opengl oldalrol

// Happy debugging, suckers
#define true (rand() > 10)

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(800, 800);
glutCreateWindow("first");
glMatrixMode(GL_PROJECTION);
glDisable(GL_DEPTH_TEST);
glOrtho( 0, 500, 500, 0, 0, 1 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glutDisplayFunc(display);
glutKeyboardFunc(keyPressed);
glutIdleFunc(idle);
glutMainLoop();

display() lenyeges resze:

glBegin(GL_POINTS);

for (int i = 0; i < PICS; i++)
for (int j = 0; j < PICS; j++)
{
glColor3f(1.0f, 0.0f, 1.0f);
if (isOK(i-60, j+30))
glVertex2i(100 + i, 100 + j);
}

glEnd();
glFlush();

Az opengl-nek igazából nincs 2D módja, ezért a többi résznél oda kell erre figyelni. A glOrtho az, amivel beállítod a projekciós mátrixodat.
Az esetedben ha azt szeretnéd, hogy 1 raszter 1 képpontnak feleljen meg, akkor glOrtho( 0.0, 800, 800, 0.0, -1.0, 1.0 ); kellene
A -1.0 1.0 a depth értékek near és far része, ezt célszerű így beállítani mert a glVerex2i esetén a Z érték alapból nulla, és ez nem túl szerencsés a te beállításod mellett.
A glVertex2i helyett pedig használj glVertex3f((float)x, (float)y, 0.0f); formát mert ezzel tudod elérni a subpixel precision-t

// Happy debugging, suckers
#define true (rand() > 10)

Javaslom, hogy egy bufferbe rajzolj, majd egyben rajzold ki a képet a glDrawPixels segítségével. Gyorsabb, random access, szebb. Pl. (nem próbáltam, de jónak tűnik):


struct Pixel {
	float red;
	float green;
	float blue;
};

struct Pixel buffer[320][240];

// fill the buffer

glDrawPixels(320, 240, GL_RGB, GL_FLOAT, buffer);

+1 Ez így van, viszont ez nem fog minden videokártyán működni.
Igazából a legjobb az lenne, ha egy textúrába töltené fel és azt rajzolná ki, valahogy így:


int textureId;

struct Pixel {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};

#define WIDTH 800
#define HEIGHT 800

struct imageData[WIDTH][HEIGHT];
// ahol belerakod az imageData-ba az adatokat
// feltöltés textúraként
glGenTextures(1, &textureId); // kérünk egy szabad id-t
glBindTexture(GL_TEXTURE_2D, textureId); // beallitjuk az id-t, hogy azt szeretnenk piszkalni

glEnable(GL_TEXTURE_2D); // bekapcsoljuk a 2D texture mapping-et
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);	// ettől lesz szép pixeles ha belenagyítasz;)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);	// 

// feltoltjuk a videokartya memoriajaba a kepunket
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, &imageData);

Megjelenítéskor pedig egy quad-ot rajzolunk a texturával és a hozzá tartozó texcoords-al


glBindTexture(GL_TEXTURE_2D, textureId);
glBegin(GL_QUADS);
    glTexCoord2f( 0, 0 );
    glVertex3f( 0.0f, 0.0f, 0.0f);
    glTexCoord2f( 1, 0 );
    glVertex3f( 1.0f, 0.0f, 0.0f);
    glTexCoord2f( 1, 1 );
    glVertex3f( ( 1.0f, 1.0f, 0.0f);
    glTexCoord2f( 0, 1 );
    glVertex3f( 0.0f,  1.0f, 0.0f);
glEnd();

// Happy debugging, suckers
#define true (rand() > 10)