ben une texture "miroir"
Source / Exemple :
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "ReadTex.h"
#include "ModuleManipulateur.h"
#include "ModuleMenus.h"
#include "ModuleReshape.h"
#define USE_ZBUFFER
#define USE_TEXTURE
#define DEG2RAD (3.14159/180.0)
#define TABLE_TEXTURE "reflect.rgb" // Le fichier est une image rgb
#define MAX_OBJECTS 2
static int ImgWidth,ImgHeight;
static GLenum ImgFormat;
static GLubyte *Image = NULL;
static GLint table_list;
static GLint objects_list[MAX_OBJECTS];
static GLfloat xrot,yrot;
static GLfloat spin;
static void make_table(void) {
static GLfloat table_mat[] = { 1.0F,1.0F,1.0F,0.6F };
static GLfloat gray[] = { 0.4F,0.4F,0.4F,1.0F };
table_list = glGenLists(1);
glNewList(table_list,GL_COMPILE);
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,table_mat);
glMaterialfv(GL_FRONT,GL_DIFFUSE,table_mat);
glMaterialfv(GL_FRONT,GL_AMBIENT,gray);
glPushMatrix();
glScalef(4.0,4.0,4.0);
glBegin(GL_POLYGON);
glNormal3f(0.0,1.0,0.0);
glTexCoord2f(0.0,0.0);
glVertex3f(-1.0,0.0, 1.0);
glTexCoord2f(1.0,0.0);
glVertex3f(1.0,0.0, 1.0);
glTexCoord2f(1.0,1.0);
glVertex3f(1.0,0.0,-1.0);
glTexCoord2f(0.0,1.0);
glVertex3f(-1.0,0.0,-1.0);
glEnd();
glPopMatrix();
glDisable(GL_TEXTURE_2D);
glEndList();
}
static void make_objects(void) {
GLUquadricObj *q;
static GLfloat cyan[] = { 0.0F,1.0F,1.0F,1.0F };
static GLfloat green[] = { 0.2F,1.0F,0.2F,1.0F };
static GLfloat black[] = { 0.0F,0.0F,0.0F,0.0F };
q = gluNewQuadric();
gluQuadricDrawStyle(q,GLU_FILL);
gluQuadricNormals(q,GLU_SMOOTH);
objects_list[0] = glGenLists(1);
glNewList(objects_list[0],GL_COMPILE);
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,cyan);
glMaterialfv(GL_FRONT,GL_EMISSION,black);
gluCylinder(q,0.5,0.5, 1.0,15,10);
glEndList();
objects_list[1] = glGenLists(1);
glNewList(objects_list[1],GL_COMPILE);
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,green);
glMaterialfv(GL_FRONT,GL_EMISSION,black);
gluCylinder(q,1.5,0.0, 2.5,15,10);
glEndList();
}
static GLfloat light_pos[] = { 0.0,20.0,0.0,1.0 };
static void init(void) {
make_table();
make_objects();
#ifdef USE_TEXTURE
Image = LoadRGBImage(TABLE_TEXTURE,&ImgWidth,&ImgHeight,&ImgFormat);
if(!Image) {
printf("Couldn't read %s\n",TABLE_TEXTURE);
exit(0); }
gluBuild2DMipmaps(GL_TEXTURE_2D,3,ImgWidth,ImgHeight,ImgFormat,GL_UNSIGNED_BYTE,Image);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
#endif
xrot = 30.0;
yrot = 50.0;
spin = 0.0;
#ifndef USE_ZBUFFER
glEnable(GL_CULL_FACE);
#endif
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glClearColor(0.5,0.5,0.5,1.0);
glEnable(GL_NORMALIZE);
}
static void draw_objects(GLfloat eyex,GLfloat eyey,GLfloat eyez) {
#ifndef USE_ZBUFFER
if(eyex<0.5) {
#endif
glPushMatrix();
glTranslatef(1.0,1.5,0.0);
glRotatef(spin,1.0,0.5,0.0);
glRotatef(0.5F*spin,0.0,0.5,1.0);
glCallList(objects_list[0]);
glPopMatrix();
glPushMatrix();
glTranslatef(-1.0,(float) (0.85+3.0*fabs(cos(0.01*spin))),0.0);
glRotatef(0.5F*spin,0.0,0.5,1.0);
glRotatef(spin,1.0,0.5,0.0);
glScalef(0.5,0.5,0.5);
glCallList(objects_list[1]);
glPopMatrix();
#ifndef USE_ZBUFFER
}
else {
glPushMatrix();
glTranslatef(-1.0,0.85+3.0*fabs(cos(0.01*spin)),0.0);
glRotatef(0.5*spin,0.0,0.5,1.0);
glRotatef(spin,1.0,0.5,0.0);
glScalef(0.5,0.5,0.5);
glCallList(objects_list[1]);
glPopMatrix();
glPushMatrix();
glTranslatef(1.0,1.5,0.0);
glRotatef(spin,1.0,0.5,0.0);
glRotatef(0.5*spin,0.0,0.5,1.0);
glCallList(objects_list[0]);
glPopMatrix(); }
#endif
}
static void draw_table(void) {
glCallList(table_list);
}
static void display(void) {
GLfloat dist = 20.0;
GLfloat eyex,eyey,eyez;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
eyex =(float) (dist * cos(yrot*DEG2RAD) * cos(xrot*DEG2RAD));
eyez =(float) (dist * sin(yrot*DEG2RAD) * cos(xrot*DEG2RAD));
eyey =(float) (dist * sin(xrot*DEG2RAD));
glPushMatrix();
gluLookAt(eyex,eyey,eyez,0.0,0.0,0.0, 0.0,1.0,0.0);
manipulateurSouris();
manipulateurClavier();
glLightfv(GL_LIGHT0,GL_POSITION,light_pos);
glEnable(GL_STENCIL_TEST);
#ifdef USE_ZBUFFER
glDisable(GL_DEPTH_TEST);
#endif
glStencilFunc(GL_ALWAYS,1,0xffffffff);
glStencilOp(GL_REPLACE,GL_REPLACE,GL_REPLACE);
glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE);
draw_table();
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
#ifdef USE_ZBUFFER
glEnable(GL_DEPTH_TEST);
#endif
if(eyey>0.0) {
glPushMatrix();
glStencilFunc(GL_EQUAL,1,0xffffffff);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
glScalef(1.0,-1.0,1.0);
glLightfv(GL_LIGHT0,GL_POSITION,light_pos);
draw_objects(eyex,eyey,eyez);
glPopMatrix();
glLightfv(GL_LIGHT0,GL_POSITION,light_pos); }
glDisable(GL_STENCIL_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
#ifdef USE_TEXTURE
glEnable(GL_TEXTURE_2D);
#endif
draw_table();
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glPushMatrix();
draw_objects(eyex,eyey,eyez);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
#if 0
void display(void) {
GLfloat dist = 20.0;
GLfloat eyex,eyey,eyez;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
eyex = dist * cos(yrot*DEG2RAD) * cos(xrot*DEG2RAD);
eyez = dist * sin(yrot*DEG2RAD) * cos(xrot*DEG2RAD);
eyey = dist * sin(xrot*DEG2RAD);
glPushMatrix();
gluLookAt(eyex,eyey,eyez,0.0,0.0,0.0, 0.0,1.0,0.0);
manipulateurSouris();
manipulateurClavier();
draw_table();
glPopMatrix();
auxSwapBuffers(); }
#endif
static void idle(void) {
spin += 2.0;
yrot += 3.0;
glutPostRedisplay() ;
}
int main(int argc,char **argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE|GLUT_STENCIL);
glutInitWindowSize(400,300);
glutInitWindowPosition(50,50);
glutCreateWindow("Réflexions par mappage de texture");
init();
creationMenuBasique();
setParametresFrustumBasique(-1.0F,1.0F,-1.0,1.0F,4.0F,300.0F,0.0F,0.0F,0.0F);
setManipulateurDistance(20.0F);
glutReshapeFunc(reshapeFrustumBasique);
glutIdleFunc(idle);
glutKeyboardFunc(keyBasique);
glutSpecialFunc(specialBasique);
glutMotionFunc(motionBasique);
glutMouseFunc(sourisBasique);
glutDisplayFunc(display);
glutMainLoop();
return(0);
}
Conclusion :
C tt rien de spe.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.