PDA

View Full Version : "Shimmering" images



cedrick
11-11-2009, 04:19 PM
Before I ask my question, I must say that I just started learning OpenGL and my question may look ridiculous.

I took a sample program which renders a few 3d objects and I changed it by adding a glutIdleFunc and now the images are "shimmering". I'm pretty sure this is a newbie question and I'll be very thankful if someone can point my error.

And here is the code:

#include <stdlib.h>
#include <GL/glut.h>

int x=0;
int y=0;

struct point
{
GLfloat x, y;
};

point j8[] =
{
{-0.334818, 0.435331},
{ 0.286438, -0.393495},
{ 0.459462, 0.141540},
{-0.414498, -0.192829},
{-0.183790, 0.082102},
{-0.079263, -0.317383},
{ 0.102254, 0.299133},
{ 0.164216, -0.054399}
};

void init()
{
GLfloat mat_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_position[] = { 0.0, 0.0, 10.0, 1.0 };
GLfloat lm_ambient[] = { 0.2, 0.2, 0.2, 1.0 };

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, 50.0);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lm_ambient);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glShadeModel (GL_FLAT);

glClearColor(0.0, 0.0, 0.0, 0.0);
glClearAccum(0.0, 0.0, 0.0, 0.0);
}

void displayObjects()
{
GLfloat cube_diffuse[] = { 0.0, 0.7, 0.7, 1.0 };
GLfloat sphere_diffuse[] = { 0.7, 0.0, 0.7, 1.0 };

glPushMatrix ();
glRotatef (30.0, 1.0, 0.0, 0.0);

glPushMatrix ();
glTranslatef (-0.75, -0.50, 0.0);
glRotatef (45.0+x/10, 0.0, 0.0, 1.0);
glRotatef (45.0+y/10, 1.0, 0.0, 0.0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, cube_diffuse);
glScalef(2,2,.1);
glutSolidCube (1.5);
glPopMatrix ();

glPushMatrix ();
glTranslatef (0+x/100, 0+y/100, 0.0);
glRotatef (30.0, 1.0, 0.0, 0.0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, sphere_diffuse);
glutSolidSphere (1.0, 16, 16);
glPopMatrix ();

glPopMatrix ();
}

#define ACSIZE 8

void display()
{

GLint viewport[4];
int count;

glGetIntegerv (GL_VIEWPORT, viewport);

glClear(GL_ACCUM_BUFFER_BIT);
for (count = 0; count < ACSIZE; count++) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();

glTranslatef (j8[count].x*4.5/viewport[2], j8[count].y*4.5/viewport[3], 0.0);
displayObjects ();
glPopMatrix ();
glAccum(GL_ACCUM, 1.0/ACSIZE);
}
glAccum (GL_RETURN, 1.0);
glFlush();
}

void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-2.25, 2.25, -2.25*h/w, 2.25*h/w, -10.0, 10.0);
else
glOrtho (-2.25*w/h, 2.25*w/h, -2.25, 2.25, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
}
}

void display2(int z, int zz){
x=z;
y=zz;
display();
}

int main(int argc, char** argv)
{
glutInit(&amp;argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_ACCUM | GLUT_DEPTH);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutPassiveMotionFunc(display2);
glutIdleFunc(display);
glutMainLoop();
return 0;
}

cedrick
11-12-2009, 01:19 AM
Found it. Thanks anyway.