PDA

View Full Version : Clear Screen



Velovix
08-05-2011, 05:12 PM
I'm trying to make a C++ program with GLUT where a little spaceship is drawn and then moved around. My problem is that the program doesn't seem to clear afterimages of the spaceship, and so the ship leaves a trail after it. Here is the code:


#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include <stdlib.h>
#include "drawEnt.h"

static int slices = 16;
static int stacks = 16;

bool success;

float xPlayer = 0; float yPlayer = 0;

/* GLUT callback Handlers */

static void resize(int width, int height)
{
const float ar = (float) width / (float) height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(width/-2, width/2, height/-2, height/2 ,0,1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

static void display(void)
{
const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
const double a = t*90.0;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3d(0,1,0);

//Set all point values
pP1 [1] = xPlayer; pP1 [2] = yPlayer+12;
pP2 [1] = xPlayer + 11; pP2 [2] = yPlayer-11;
pP3 [1] = xPlayer - 11; pP3 [2] = yPlayer-11;

//Draw Player
glBegin(GL_LINES);
glVertex2f( pP1 [1], pP1 [2] );
glVertex2f( pP2 [1], pP2 [2] );
glEnd;

glBegin(GL_LINES);
glVertex2f( pP2 [1], pP2 [2] );
glVertex2f( xPlayer, yPlayer );
glEnd;

glBegin(GL_LINES);
glVertex2f( xPlayer, yPlayer );
glVertex2f( pP3 [1], pP3 [2] );
glEnd;

glBegin(GL_LINES);
glVertex2f( pP3 [1], pP3 [2] );
glVertex2f( pP1 [1], pP1 [2] );
glEnd;

glutSwapBuffers();

}


static void key(unsigned char key, int x, int y)
{
switch (key)
{
case 27 :
case 'q':
exit(0);
break;

case '+':
slices++;
stacks++;
break;

case '-':
if (slices>3 &amp;&amp; stacks>3)
{
slices--;
stacks--;
}
break;

case 'w':
yPlayer = yPlayer + 5;
break;
}

glutPostRedisplay();
}

static void idle(void)
{
glutPostRedisplay();
}

const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

/* Program entry point */

int main(int argc, char *argv[])
{
glutInit(&amp;argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glutCreateWindow("Vectrocity");

glutReshapeFunc(resize);
glutDisplayFunc(display);
glutKeyboardFunc(key);
glutIdleFunc(idle);

glClearColor(0,0,0,1);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

glutMainLoop();

return EXIT_SUCCESS;
}

mobeen
08-05-2011, 08:30 PM
Don't modify the depth func to less. Keep the default. In other words, remove this line
glDepthFunc(GL_LESS);
and see if it helps.

Velovix
08-05-2011, 09:50 PM
Don't modify the depth func to less. Keep the default. In other words, remove this line
glDepthFunc(GL_LESS);
and see if it helps.
That didn't seem to fix the problem, or do anything at all. Thanks for the reply, though.

BionicBytes
08-06-2011, 01:31 PM
Your code looks fine so there's no problem there.
What's your window initialisation code - specifically with regard to double buffering?

Incidentally, you have this line:

glEnable(GL_DEPTH_TEST);
You should actually disable depth testing since your are drawing in 2D via the glOrtho projection.

Velovix
08-07-2011, 12:29 PM
Incidentally, you have this line:

glEnable(GL_DEPTH_TEST);
Yes, I actually did disable it at some point. I changed it to see if that fixed the problem and never changed it back.


Your code looks fine so there's no problem there.
What's your window initialisation code - specifically with regard to double buffering?

Window initialization code. I'm afraid I gave you all the code I am aware of. Where would I find this?

Edit: You should probably know that it updates fine and gets rid of all the afterimages of the ship if I re size the window.

MaxH
08-07-2011, 09:08 PM
glBegin(GL_LINES);
glVertex2f( pP1 [1], pP1 [2] );
glVertex2f( pP2 [1], pP2 [2] );
glEnd; // very bad !!!!

glEnd(); // correction !!!!


The problem is in your Display function. All of the glEnds have to have an open and close parens after them.

Velovix
08-08-2011, 02:29 PM
glBegin(GL_LINES);
glVertex2f( pP1 [1], pP1 [2] );
glVertex2f( pP2 [1], pP2 [2] );
glEnd; // very bad !!!!

glEnd(); // correction !!!!


The problem is in your Display function. All of the glEnds have to have an open and close parens after them.

Wow, your right. I don't know how I managed to make that mistake four times in a row, but either way, it fixed the problem! Thank you!

Of course the second time I run the program the computer blue screens.. I'm calling that bad luck for now..

MaxH
08-08-2011, 03:15 PM
Wow, your right. I don't know how I managed to make that mistake four times in a row, but either way, it fixed the problem! Thank you! No problem. I've made that mistake myself a few times.
It's nasty, because it compiles and runs, but the graphics is messed up.
So U don't expect it to be a simple syntax problem.

A small suggestion -
glBegin(GL_LINES) tells OpenGL that every pair of vertices to follow is to be taken as a line segment.
Hence U don't need all those glBegins and glEnds. U only need one of each.
Your code can be written very compactly as ....



glBegin(GL_LINES);
glVertex2f ( pP1[1], pP1[2]); glVertex2f ( pP2[1], pP2[2]);
glVertex2f ( pP2[1], pP2[2]); glVertex2f (xPlayer, yPlayer);
glVertex2f (xPlayer, yPlayer); glVertex2f ( pP3[1], pP3[2]);
glVertex2f ( pP3[1], pP3[2]); glVertex2f ( pP1[1], pP1[2]);
glEnd();

Or, even better ....


glBegin(GL_LINE_LOOP);
glVertex2f ( pP1[1], pP1[2]);
glVertex2f ( pP2[1], pP2[2]);
glVertex2f (xPlayer, yPlayer);
glVertex2f ( pP3[1], pP3[2]);
glEnd();