je trouve que on peut implimenter l'algo de z buffer avec opengl et recuperer les donnee avec la fonction de opengl "glreadpixels" mais je trouve un probleme tel que j'essais de lire le buffer et afficher le contenue mais je trouve que le contenue est des 1. mon code source est le suivant:
#include "stdafx.h"
#include<stdio.h>
#include<malloc.h>
#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
/* declaration des varaibles globales */
//----------------------------------------
float prfi,prfs,prfs1,sprof=0,nbsommet=0,buffer[4884],zbuffer[74][66];
int choix=0;
//---------------------------------------
/*declaration de type */
typedef struct _vecteur{float x,y,z;}vecteur;
//---------------------------------------
/* declaration des listes*/
typedef struct _vertex
{
vecteur v;
struct _vertex *suiv;
}vertex;
typedef struct _facet
{
vertex *ft[3];
struct _facet *suivft;
}facet;
//-------------------------------------
/* fonc initial des pointeur */
vertex *tetev1=NULL;
vertex *finv1=NULL;
facet *teteft=NULL;
facet *finft=NULL;
//-------------------------------------------------
//liste des vertexe
void creer(float x1,float y1,float z1)
{
vertex *v;
v=(struct _vertex *) malloc(sizeof(struct _vertex));
v->v.x=(double)x1;
v->v.y=(double)y1;
v->v.z=(double)z1;
v->suiv=NULL;
if(tetev1==NULL)
{
tetev1=v;
finv1=v;
}
else
{
finv1->suiv=v;
finv1=v;
}
}
void creerlistef(int v11,int v22,int v33)
{
facet *f;
vertex *v;
int i,k=0;
f=(struct _facet *) malloc(sizeof(struct _facet));
v=tetev1;
while(v!=NULL)
{
if(k==v11)
f->ft[0]=v;
if(k==v22)
f->ft[1]=v;
if(k==v33)
f->ft[2]=v;
k++;
v=v->suiv;
}
f->suivft=NULL;
if(teteft==NULL)
{
teteft=f;
finft=f;
}
else
{
finft->suivft=f;
finft=f;
}
}
//-----------------------------------------------------
void lirefichier()
{
printf("lecture de fichier\n");
char ligne[256],v ;
int lligne,compte,g=0,i,j=0, o=0,k, f1=0,f2=0,v1,v2,v3;
float x1,y1,z1;
FILE *face;
//ouverture de la fichier obj
face = fopen("001_01_00_nhf_r1.wrl","r");
//teste si l'ouverture est échoue
if (face == NULL)
{
printf("erreur de l'ouverture de fichier obj");
exit(1);
}
while (!feof (face)) //tantque non fin de fichier
{
if( (fgets(ligne, 100, face) == NULL))
{
//fin de fichier
break;
}
//trouver la langeur de ligne
lligne = strlen(ligne);
while ((lligne > 0) && ((ligne[lligne - 1] == ' ') ||
(ligne[lligne - 1] == '\n')))
lligne--;
if(lligne>0)//la ligne n'est pas vide
{
i=0;
while (ligne[i] == ' ') i++;
if(((ligne[i]=='[')||(ligne[i]==']'))||((ligne[i]=='{')||(ligne[i]=='}'))||((ligne[i]=='n')||(ligne[i]=='N'))||((ligne[i]=='v')||(ligne[i]=='V')))
{
o=0;f1=0;f2=0;
}
if(o==1)//coordonnee de point
{
j++;
compte = sscanf(ligne, "%f %f %f ", &x1,&y1, &z1);
if(g==0)
{
prfi=x1;
prfs=y1;
g=1;
}
nbsommet++;
sprof=sprof+z1;
if(prfi<x1)prfi=x1;
if(prfs<y1)prfs=y1;
//on ajoute le nouveau vertexe a la liste
creer(x1,y1,z1);
}
if((ligne[i]=='I')&&(ligne[i+7]=='F')&&(ligne[i+8]=='a')&&(ligne[i+9]=='c')&&(ligne[i+11]=='S'))//IndexedFaceSet f indique l'ensemble des vertexe de la face
if(o==0)
f1=1;
if(o==0)//
{
if((f1==1)&&(f2==1))//les facettes
{
compte = sscanf(ligne, "%d %c %d %c %d",&v1,&v,&v2,&v,&v3);
//on ajoute la nouvelle face a la liste
creerlistef(v1,v2,v3);
}
}
if((ligne[i]=='p')&&(ligne[i+1]=='o')&&(ligne[i+2]=='i')&&(ligne[i+3]=='n'))//g indique l'objet
o=1;
if((ligne[i]=='c')&&(ligne[i+1]=='o'))//&&(ligne[i+2]=='O')&&(ligne[i+3]=='r')&&(ligne[i+5]=='I'))//IndexedFaceSet f indique l'ensemble des vertexe de la face
f2=1;
}
}
printf(" fin de lecture de fichier\n");
//fermeture de la fichier vrml
fclose(face);
}
//libérer l'allocation d'espace mémoire
void free()
{
vertex *v,*vv;
facet *f,*ff;
v=tetev1;
while(v!=NULL)
{
vv=v;
v=v->suiv;
free(vv);
}
f=teteft;
while(f!=NULL)
{
ff=f;
f=f->suivft;
free(ff);
}
}
//----------------------------------------------------------
//procedureb d'initialisation du buffer
void initzbuffer()
{
for(int i=0;i<66;i++)
{
for(int j=0;j<74;j++)
{
zbuffer[i][j]=prfi;
}
}
}
//----------------------------------------------------------
//procedure d'affichage
void rendu()
{
printf("debute de rend prfs1=%f\n",prfs1);
int i,langueur=60,largeur=105,index,count[6300];
float x,x1,y,z,moy,profondeur[6300];
vertex *v,*q;
facet *f;
f=teteft;
printf("debute de rendu\n");
q=tetev1;
int k=0;
moy=sprof/nbsommet;
while (f!=NULL)
{
glBegin(GL_POINTS);
for( i=0;i<3 ;i++)
{
//******************
// tracage des arrête
//******************
x=f->ft[i]->v.x;
y=f->ft[i]->v.y;
z=f->ft[i]->v.z;
glVertex3f(x,y,z);
}
printf("\n");
glEnd() ;
f=f->suivft;
}
printf("fin rend\n");
glReadPixels(0,0,74,66,GL_DEPTH_COMPONENT,GL_FLOAT,buffer);
for(int i=0;i<4884;i++)
{
buffer[i];
printf(" depth=%f",buffer[i]);
}
}
//--------------------------------------------------
void redraw()//()
{
//remplace la matrice courante par la matrice identité
glLoadIdentity ();
glTranslatef (30.0f, 52.5f, 0.0f);
glScalef(0.5f,0.5f,0.5f);
rendu();
glFlush ();
}
void reshape(int w,int h)
{
if (h == 0)
h = 1;
glClearColor (0.0,0.0,0.0,0.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// glViewport() permet de limiter la zone de dessin à une portion de la fenêtre
glViewport (0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (45.0, (GLfloat)w/(GLfloat)h, 0.1, 1000.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glDepthMask(GL_TRUE);
//glutPostRedisplay indique que la fenêtre doit être rafraîchie
glutPostRedisplay ();
}
void myinit (void)
{
glShadeModel(GL_SMOOTH);
}
//----------------------------------------------------------
int main(int argc, char* argv[])
{
//lirefichier();
lirefichier();
//glutInitDisplayMode : spécifie le mode d'affichage de la fenêtre.
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
//Définit la taille de la fenêtre à l'écran.
glutInitWindowSize(74,66);
//Définit la position de la fenêtre sur l'écran
glutInitWindowPosition(50,50);
//Crée une fenêtre avec le titre "dessin en fil de fer"
//selon les paramètres définis lors de l'exécution des fonctions précédentes
//La fenêtre n'est affichée qu'ultérieurement lors de l'exécution de glutMainLoop.
glutCreateWindow("dessin en fil de fer");
myinit();
//La fonction glutReshapeFunc établit la fonction de rappel de redimensionnement
//de la fenêtre courante. La fonction de rappel de redimensionnement est déclenchée
//lorsque la fenêtre est refaçonnée
glutReshapeFunc(reshape);
//La fonction glutDisplayFunc établit la fonction de rappel pour la fenêtre courante.
//Quand GLUT détermine que le plan normal de la fenêtre doit être réaffiché,
//la fonction de rappel d'affichage est appelée
glutDisplayFunc(redraw);
//Cette fonction permet d'entrer dans la boucle de GLUT de traitement des événements.
//Cette fonction est appelée seulement une fois dans une application. Dans cette boucle,
//les fonctions de rappel qui ont été enregistrées sont appelées à tour de rôle.
glutMainLoop();
//freeliste();
free();
//============
return 0;
}
Svp aidez-moi pour résoudre mon problème et merci d’avance