Faces cachées affichées en opengl

cs_Darkan Messages postés 22 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 28 mars 2005 - 21 mars 2005 à 13:46
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 - 1 mai 2005 à 10:28
rebonjour a tous!
j'ai un 2eme probleme. J'ai l'impression que bien que certains murs soient caché par d'autres, ils sont affichés qd meme, puisque plus ma map est grande, plus le jeu rame.
Est ce qu'il y a moyen d'eviter ca ?

merci d'avance^^

15 réponses

KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
21 mars 2005 à 19:44
T'as implemente des algos de suppression de faces cachées ?, ou de decoupage en zone de ta map ? ou tu affiche tout tout le temps ?
Si aucun ben c un peu normal....

KeniiyK
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
22 mars 2005 à 00:09
oula oula tu fait ton propre moteur 3d ou tu utilises opengl? directX?...
Si c'est openGL il faut activer le Zbuffer
Avec glut ca fait:

A l'initialisation :
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); //GLUT_DEPTH active le Zbuffer

Et dans ta fonction de dessin avant chaque rendu :

glClear
(
GL_COLOR_BUFFER_BIT | // efface l'ecran
GL_DEPTH_BUFFER_BIT // efface le Zbuffer
);
0
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
22 mars 2005 à 12:29
Oué d'ailleur la fonction DEPH BUFFER elle marche pas super bien !!

moi je l'utilise et même en utilisant un octree et tout le tralala et ben OpenGL me fait des bugs !!

il suprime des faces (texture transparante on dirait) et du coup affiche se qui a deriere....

sa fait un peu flic quand meme.....

Je suis entrain de changer et de dessiner en utilisant GLDrawAray... pour voir si sa peu venir de cela ;)

N'empeche que DirectX gere tout seul les octree, frustum et tout et tout !! c'est limite si tu lui dis :

"Dessine une map avec la mer et un bla bla...."

et il te le dessine !!! faut aller voir les exemples qu'il donne !!

bref...



aplus
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
22 mars 2005 à 12:54
Barraq, je sais pas si t'as lu tout les post sur "pb echelle OpenGL", il y a un moment ou je t'ai parlé du Z-Buffer, et si ton pb vient de ca alors ca changera rien que tu utilise les glDrawArray...

KeniiyK
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Darkan Messages postés 22 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 28 mars 2005
22 mars 2005 à 15:11
euh, chui dans la partie opengl, donc ui, je parle d'opengl. Tout est defini comme tu l'a dis, mais ya quand meme des ralentis...
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
22 mars 2005 à 22:00
Explique toi !! quand est qu'il y a des ralentis ? a tu encore les bugs de faces qui devraient etre cachées et qu'il ne le sont pas?

barraq je sais comment tu utilise le depth buffer de Opengl mais a mon avis il de conne pas !^^ je pense plutot que tu t'en sert pas correctement....
0
cs_Darkan Messages postés 22 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 28 mars 2005
23 mars 2005 à 14:33
arf, pas facile a expliquer. En fait, j'ai fais un laby en 3D. Lorsque je suis en vue a la 1ere personne, je ne vois que les murs en face de moi. Et pourtant, en fonction de la taille du laby, le jeu rame plus ou moins, alors qu'on ne voit pas plus de faces a l'ecran

voila, j'espere que c'est un peu plus clair ^^
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
25 mars 2005 à 20:20
Donc maintenant tu vois plus les faces cachées c'est une bonne chose...

Mais tu est sur que ca viens de la quantité des polys que le jeu rame?
Peut etre qu'il faudrait que tu diminues la distance maximale a la quelle tu peut voir...
parce que si elle est trop grande OpenGL va calculer quand meme la distance d'un mur dans le Zbuffer meme si celui ci est a 3km caché par une vingtaine de murs!!
Par contre le ne sais pas comment parametrer cela dans openGL mais sur internet tu trouveras surement.
0
cs_Darkan Messages postés 22 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 28 mars 2005
28 mars 2005 à 18:32
ah ui, c'est possible. En vue ortho, lorsque je change la profondeur, en fait la camera recule, donc je me suis dis qu'il gerait ca tout seul, en ortho comme en perspective. Je vais regarder ce que je peux faire

merci ^^
0
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
8 avril 2005 à 11:12
ben pourtant voila comment je l'utilise :

bool WinGL::InitializeOpenGL ()

{

// Try to get the Device Context

if ( !(_hDC = GetDC(_OpenGLHwnd)) )

{

KillGLWindow(); // Reset the display

MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return false;

}



// Are we able to set our pixel format/information

if ( !SetupPixelFormat() )

PostQuitMessage (0);



// Try to get the Rendering Context

if ( !(_hRC = wglCreateContext(_hDC)) )

{

KillGLWindow(); // Reset the display

MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return false;

}





// Try to activate the Rendering Context

if( !wglMakeCurrent(_hDC,_hRC) )

{

KillGLWindow(); // Reset the display

MessageBox(NULL,"Can't Activate
The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return false;

}



// Enable the multitexturing

_Terrain->EnableMultiTexturing();



_OpenGLHwnd.Show();

// Show the window

SetForegroundWindow(_OpenGLHwnd); // Slightly higher priority

ReSizeGLScene();

// Set up our perspective GL screen ( translations
and viewport )



return true; // Return a success!

}



et en suite dans SetPixelFormat :



bool WinGL::SetupPixelFormat()

{

int PixelFormat;



// Define the PixelFormatDescriptor

static PIXELFORMATDESCRIPTOR pfd= // pfd tells windows how we want things to be

{

sizeof(PIXELFORMATDESCRIPTOR), // Size of this pixel format descriptor


1,

// Version number


PFD_DRAW_TO_WINDOW |
// Format must support window


PFD_SUPPORT_OPENGL |
// Format must support OpenGL


PFD_DOUBLEBUFFER,
// Must support double buffering


PFD_TYPE_RGBA,
// Request an RGBA format


BITS,

// Select our color depth

0, 0, 0, 0, 0,
0,
// Color bits ignored


0,

// No alpha buffer


0,

// Shift bit ignored


0,

// No accumulation buffer

0, 0, 0,
0,
//
Accumulation bits ignored


16,

// 16Bit Z-Buffer (depth buffer)


0,

// No stencil buffer


0,

// No auxiliary buffer


PFD_MAIN_PLANE,
// Main drawing layer


0,

// Reserved

0, 0,
0

// Layer masks ignored

};



// Did windows find a matching pixel format?

if ( !(PixelFormat = ChoosePixelFormat(_hDC,&pfd)) )

{

KillGLWindow(); // Reset the display

MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return false;

}



// Are we able to set the pixel format?

if( !SetPixelFormat(_hDC,PixelFormat,&pfd) )

{

KillGLWindow(); // Reset the display

MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return false;

}



return true;

}



et voila quand je dessine :



int WinGL::DrawGLScene()

{

glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT); // Clear The Screen And The
Depth Buffer

glLoadIdentity();


// Reset The matrix



// Update our player view,pos,..., and send that to the network

_Camera->SetLook();

_NetWork->SetPosition(_Camera->GetPosition(), _Camera->GetView());



// Each frame we calculate the new frustum. In reality you only need to

// calculate the frustum when we move the camera.

_Frustum->CalculateFrustum();



// Draw the tree

_Terrain->DrawTree();



// Here we draw the octree, starting with the root node and recursing down each node.

// When we get to each of the end nodes we will draw the vertices assigned to them.

_Flag->_TotalNodesDrawn = 0;

_Octree->DrawOctree(_Octree);



_Terrain->CreateSkyBox(_Octree->GetCenter().x,_Octree->GetCenter().y,_Octree->GetCenter().z,

_Octree->GetSize()*2,_Octree->GetSize()*2,_Octree->GetSize()*2);



// Render the cube'd nodes to visualize the octree (in wire frame mode)

if( _Flag->_DoSeeOctree )

_SeeOctree->RenderSeeOctree();



// Draw player

_Terrain->DrawPlayer(_NetWork->GetPosition(), _NetWork->NumberOfUsers(), _Camera->GetRadious());



SwapBuffers(_hDC);


// Swap the backbuffers to the
foreground



return true; // Everything is OK

}



j'utilise pas glut, alors je peu pas tutiliser le truc : lutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);

et je pense que je fais cette initialisation dans SetupPixelForma...



des idées ?

merci
0
bethoring Messages postés 30 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 29 mai 2005
29 avril 2005 à 14:42
Ce serait pa tout simplement un probleme de CULL_FACE par defaut le
cull_face qui gere les faces cachees et me semble t-il active suffit je
pense de faire un glDisable(GL_CULL_FACE) ou sinon c un glEnable jsai
plus a tester...


=--The KnowLedge Is PoWerFULL--===
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
29 avril 2005 à 17:58
ca sert a quoi le CULL_FACE?
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
29 avril 2005 à 21:27
Voui ben... c soit le Z-Buffer qui peut pas differencier toutes les distances, soit peut etre le culling (mais si c'est ca tu t'en serai appercu bien avant)...

dletozeun-> le culling sert a preciser quelles sont les faces avant et les faces arrieres suivant deux modes CCW (counter clock-wise) et CW (counter wise) ensuite tu peux dire a OpenGL de supprimer les faces avant ou les faces arrieres.
Voire plus -> dessiner les faces avant en FILL (pleine) et les faces arrieres en LINE (fillaire) :
glPolygonMode(GL_FRONT,GL_FILL);
glPolygonMode(GL_BACK,GL_LINE);

Pour plus d'info j'avais bien explique ca dans un des posts de barraq (il me semble) mais j'arrive pas a le retrouver.

KeniiyK
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
29 avril 2005 à 22:06
dletozeun-> Pardon c'etait pas un post de Barraq mais d'un autre, enfin bon peut importe, c'est là
http://www.cppfrance.com/forum.v2.aspx?rm=1&ID=388188

KeniiyK
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
1 mai 2005 à 10:28
Merci bcp KeniiyK savait pas que ca s'apellait comme ca
0
Rejoignez-nous