[ milan_d @ 26.09.2003. 19:56 ] @
Pisem Quake3 map viewer u kome hocu da iscrtam mapu tako sto sortiram poligone od najdaljeg do najblizeg, tako da bi scena trebalo da bude pravilno iscrtana bez koriscenja depth buffera. Medjutim to mi ne uspeva, poligoni koji bi trebali da se vide pojavljuju se i nestaju kako se pomera kamera. Sve rada kako treba kada je ukljucen depth buffering. Algoritam sam pronasao u raznim clancima sa interneta i trebalo bi da radi. Evo dve funkcije koje koristim za iscrtavanje mape, nadam se da su dovoljne da bi ste zakljucili kako sve radi: Code: void Q3Map::Render(const Camera& cam, float frame_time) { // pronadji klaster koji sadrzi kameru m_pCurCam = &cam; int leaf_i = FindLeaf(cam.GetPosition()); m_nCurCamCluster = m_leaves[leaf_i].cluster; // prodji kroz BSP stablo i iscrtaj sve vidljive poligone // od najdaljeg do najblizeg m_vis_faces_map.Reset(); RenderNode(0); } void Q3Map::RenderNode(int node_i) { Node& node = m_nodes[node_i]; if(node_i >= 0){ // da li je kamera ispred ravni u trenutnom cvoru? if(PointToPlaneEval(m_pCurCam->GetPosition(), m_planes[node.plane]) >= 0){ RenderNode(node.back); RenderNode(node.front); } else{ RenderNode(node.front); RenderNode(node.back); } } else{ int leaf_i = ~node_i; // iscrtaj list Leaf& leaf = m_leaves[leaf_i]; if(IsClusterVisible(m_nCurCamCluster, leaf.cluster)){ fVect3 bbox_min(leaf.mins), bbox_max(leaf.maxs); if(m_pCurCam->IsBBoxVisible(bbox_min, bbox_max)){ int last_leafface = leaf.leafface + leaf.num_leaffaces - 1; for(int i = leaf.leafface; i <= last_leafface; ++i){ int face_i = m_leaf_faces[i]; Face& face = m_faces[face_i]; if(face.type == FT_POLYGON){ if(!m_vis_faces_map.IsSet(face_i)){ m_vis_faces_map.Set(face_i); // iscrtaj ovaj poligon glActiveTextureARB(GL_TEXTURE0_ARB); m_texs[face.texture].MakeCurrent(); glEnable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE1_ARB); m_lmap_texs[face.lmap_index].MakeCurrent(); glEnable(GL_TEXTURE_2D); glDrawArrays(GL_TRIANGLE_FAN, face.vertex, face.num_vertices); } } } } } } } Znam da ovo nije najefikasniji nacin da se iscrta mapa ali to radim zbog toga da bih provalio neke stvari. Da li neko moze da mi kaze sta nije u redu u mom algoritmu? Milan |