L'exécutable: GLUtMotionBlur.exe
Flou de déplacement en OpenGL et GLUt.
/* motionblur.c - by Tom McReynolds, SGI */
/* Using the accumulation buffer for motion blur. */
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/gl.h>
const GLdouble FRUSTDIM = 100.F;
const GLdouble FRUSTNEAR = 320.F;
const GLdouble FRUSTFAR = 660.F;
GLfloat *make_texture(int maxs,int maxt) {
int s,t;
static GLfloat *texture;
texture =(GLfloat *)malloc(maxs * maxt * sizeof(GLfloat));
for(t = 0; t < maxt; t++) {
for(s = 0; s < maxs; s++) {
texture[s + maxs * t] =((s >> 4) & 0x1) ^((t >> 4) & 0x1); } }
return texture;
}
enum {SPHERE = 1,CONE};
void render(GLfloat dx,GLfloat dy,GLfloat dz) {
static GLfloat wall_mat[] = {1.F,1.F,1.F,1.F};
glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,wall_mat);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glNormal3f(0.F,1.F,0.F);
glTexCoord2i(0,0);
glVertex3f(-100.F,-100.F,-320.F);
glTexCoord2i(1,0);
glVertex3f(100.F,-100.F,-320.F);
glTexCoord2i(1,1);
glVertex3f(100.F,-100.F,-640.F);
glTexCoord2i(0,1);
glVertex3f(-100.F,-100.F,-640.F);
glEnd();
glDisable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glNormal3f(1.F,0.F,0.F);
glVertex3f(-100.F,-100.F,-320.F);
glVertex3f(-100.F,-100.F,-640.F);
glVertex3f(-100.F,100.F,-640.F);
glVertex3f(-100.F,100.F,-320.F);
glNormal3f(-1.F,0.F,0.F);
glVertex3f(100.F,-100.F,-320.F);
glVertex3f(100.F,100.F,-320.F);
glVertex3f(100.F,100.F,-640.F);
glVertex3f(100.F,-100.F,-640.F);
glNormal3f(0.F,-1.F,0.F);
glVertex3f(-100.F,100.F,-320.F);
glVertex3f(-100.F,100.F,-640.F);
glVertex3f(100.F,100.F,-640.F);
glVertex3f(100.F,100.F,-320.F);
glNormal3f(0.F,0.F,1.F);
glVertex3f(-100.F,-100.F,-640.F);
glVertex3f(100.F,-100.F,-640.F);
glVertex3f(100.F,100.F,-640.F);
glVertex3f(-100.F,100.F,-640.F);
glEnd();
glPushMatrix();
glTranslatef(-80.F + dx,-60.F + dy,-420.F + dz);
glCallList(SPHERE);
glPopMatrix();
glPushMatrix();
glTranslatef(-20.F,-80.F,-600.F);
glCallList(CONE);
glPopMatrix();
if( glGetError() )
printf("Oops! I screwed up my OpenGL calls somewhere\n");
glFlush();
}
enum {NONE,FIELD};
int rendermode = NONE;
void menu(int selection) {
rendermode = selection;
glutPostRedisplay();
}
GLdouble focus = 420.;
void redraw() {
int i;
int max;
GLfloat dx,dy,dz;
dx = .5f;
dy = 1.F;
dz = -2.F;
glPushMatrix();
switch(rendermode) {
case NONE : render(0.F,0.F,0.F);
break;
case FIELD : max = 16;
glClear(GL_ACCUM_BUFFER_BIT);
for ( i = 0 ; i < max ; i++ ) {
render(dx * i,dy * i,dz * i);
glAccum(GL_ACCUM,1.F/max); }
glAccum(GL_RETURN,1.F);
break; }
glPopMatrix();
glutSwapBuffers();
}
void key(unsigned char key,int x,int y) {
if(key == '\033')
exit(0);
}
const int TEXDIM = 256;
int main(int argc,char **argv) {
glutInit(&argc,argv);
GLfloat *tex;
static GLfloat lightpos[] = {50.F,50.F,-320.F,1.F};
static GLfloat sphere_mat[] = {1.F,.5f,0.F,1.F};
static GLfloat cone_mat[] = {0.F,.5f,1.F,1.F};
GLUquadricObj *sphere,*cone,*base;
glutInitWindowSize(300,300);
glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_ACCUM|GLUT_DOUBLE);
glutCreateWindow("Motion blur");
glutDisplayFunc(redraw);
glutKeyboardFunc(key);
glutCreateMenu(menu);
glutAddMenuEntry("Normal",NONE);
glutAddMenuEntry("Motion Blur",FIELD);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glMatrixMode(GL_PROJECTION);
glFrustum(-FRUSTDIM,FRUSTDIM,-FRUSTDIM,FRUSTDIM,FRUSTNEAR,FRUSTFAR);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0,GL_POSITION,lightpos);
glCullFace(GL_BACK);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glNewList(SPHERE,GL_COMPILE);
sphere = gluNewQuadric();
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,sphere_mat);
gluSphere(sphere,20.F,20,20);
gluDeleteQuadric(sphere);
glEndList();
glNewList(CONE,GL_COMPILE);
cone = gluNewQuadric();
base = gluNewQuadric();
glRotatef(-90.F,1.F,0.F,0.F);
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,cone_mat);
gluDisk(base,0.,20.,20,1);
gluCylinder(cone,20.,0.,60.,20,20);
gluDeleteQuadric(cone);
gluDeleteQuadric(base);
glEndList();
tex = make_texture(TEXDIM,TEXDIM);
glTexImage2D(GL_TEXTURE_2D,0,1,TEXDIM,TEXDIM,0,GL_RED,GL_FLOAT,tex);
free(tex);
glutMainLoop();
return(0);
}