Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

BSP rendering problem

[es] :: 3D programiranje :: BSP rendering problem

[ Pregleda: 2418 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

milan_d

Član broj: 11466
Poruke: 5
*.verat.net



Profil

icon BSP rendering problem26.09.2003. u 19:56 - pre 250 meseci
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
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.sbb.co.yu



Profil

icon Re: BSP rendering problem18.10.2003. u 00:18 - pre 249 meseci
Idi na google i potrazi aftershock. Mislim da ga ima negde na planetquake.
To je kompletan q3map renderer, sa source-om u C-u.

yooyo
 
Odgovor na temu

[es] :: 3D programiranje :: BSP rendering problem

[ Pregleda: 2418 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.