Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Optimizar Bsp

Iniciado por misscelan, 06 de Julio de 2005, 08:21:51 PM

« anterior - próximo »

misscelan

 Después de mil quebraderos de cabeza por fin tengo cargado el bsp.

En un principio utilizé la manera más fácil de renderizar el bsp, sin meterme en pvs, ni frustum culling, ni nada por el estilo. Usé esto:

void render_face(int faceIndex)
{
   
    tBSPFace *pFace = &sMBSP.BSPFace[faceIndex];

    glActiveTextureARB(GL_TEXTURE0_ARB);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, todas_texturas[pFace->textureID]);

    glActiveTextureARB(GL_TEXTURE1_ARB);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, todos_lightmaps[pFace->lightmapID]);

    glBegin( GL_TRIANGLES);
      for( int j=0; j < pFace->numMeshVerts; j++)
      {

         int offset = sMBSP.BSPMeshVerts[pFace->meshVertIndex+j].pMeshVerts + pFace->vertexIndex;
   
            glMultiTexCoord2fARB(GL_TEXTURE0_ARB, sMBSP.BSPVertex[offset].vTextureCoord.u,
                                                 sMBSP.BSPVertex[offset].vTextureCoord.v);
            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, sMBSP.BSPVertex[offset].vLightmapCoord.u,
                                                 sMBSP.BSPVertex[offset].vLightmapCoord.v);
            
            glVertex3f(sMBSP.BSPVertex[offset].vPosition.x,
                      sMBSP.BSPVertex[offset].vPosition.y,
                     sMBSP.BSPVertex[offset].vPosition.z);


      }
      glEnd();


}


Con esto tenía unos fps que se movían entre 70-90.

Decidí meterme en temas mayores añadiendo pvs y frustum culling.

Y se quedo en esto.

void render_escena(tvector *vPos)
{

   int i = matConstTam[kFaces];

   callcular_planos_frustum();

   for (int i = 0; i < matConstTam[kFaces]; i++)
   caras_pintadas = false;

   int hoja_actual = encontrar_hoja(vPos);

   int cluster_actual = sMBSP.BSPLeaf[hoja_actual].cluster;

   for(i = 0; i < matConstTam[kLeafs]; i++)
   {
     if (cluster_visible(cluster_actual, sMBSP.BSPLeaf.cluster))
     {
        if(bb_frustum(sMBSP.BSPLeaf.mins,sMBSP.BSPLeaf.maxs))
         render_leaf(&sMBSP.BSPLeaf);
     }
   }

}

void render_leaf(tBSPLeaf *a)
{
   for(int i = 0; i < a->numOfLeafFaces; i++)
   {
      render_face_pvs(sMBSP.BSPLeafFaces[a->leafface + i].pLeafFaces);

   }

}



bool cluster_visible(int visCluster, int testCluster)
{

   if ((sMBSP.BSPVisData.pBitsets== NULL) || (visCluster < 0)) {
       return true;
   }

   int i = (visCluster * sMBSP.BSPVisData.bytesPerCluster) + (testCluster >> 3);
   byte visSet = sMBSP.BSPVisData.pBitsets;

   return (visSet & (1 << (testCluster & 7))) != 0;
}

El resultado de esto son unos frames por seg que se mueven entre 40-80. Si me mantengo en la zona donde empiezo los frames estan entre 120-130 pero en cuando empiezo a pasear por el mapa bajan a lo dicho anteriormente. El problema no parece estar en la función de pintar caras(no la he puesto en este post) porque si la comento no sale en pantalla nada (obviamente) pero la tasa de frames aunque sube unos 30 más o menos sigue bajando en picado cuando me muevo. Si comento la función de la caja del frustum apenas se nota.

Dónde puede estar el cuello de botella?

Muchas gracias.

Un saludo

samsaga2

Cita de: "misscelan"Después de mil quebraderos de cabeza por fin tengo cargado el bsp.

En un principio utilizé la manera más fácil de renderizar el bsp, sin meterme en pvs, ni frustum culling, ni nada por el estilo. Usé esto:

void render_face(int faceIndex)
{
   
    tBSPFace *pFace = &sMBSP.BSPFace[faceIndex];

    glActiveTextureARB(GL_TEXTURE0_ARB);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, todas_texturas[pFace->textureID]);

    glActiveTextureARB(GL_TEXTURE1_ARB);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, todos_lightmaps[pFace->lightmapID]);

    glBegin( GL_TRIANGLES);
      for( int j=0; j < pFace->numMeshVerts; j++)
      {

         int offset = sMBSP.BSPMeshVerts[pFace->meshVertIndex+j].pMeshVerts + pFace->vertexIndex;
   
            glMultiTexCoord2fARB(GL_TEXTURE0_ARB, sMBSP.BSPVertex[offset].vTextureCoord.u,
                                                 sMBSP.BSPVertex[offset].vTextureCoord.v);
            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, sMBSP.BSPVertex[offset].vLightmapCoord.u,
                                                 sMBSP.BSPVertex[offset].vLightmapCoord.v);
            
            glVertex3f(sMBSP.BSPVertex[offset].vPosition.x,
                      sMBSP.BSPVertex[offset].vPosition.y,
                     sMBSP.BSPVertex[offset].vPosition.z);


      }
      glEnd();


}


Con esto tenía unos fps que se movían entre 70-90.

Decidí meterme en temas mayores añadiendo pvs y frustum culling.

Y se quedo en esto.

void render_escena(tvector *vPos)
{

   int i = matConstTam[kFaces];

   callcular_planos_frustum();

   for (int i = 0; i < matConstTam[kFaces]; i++)
   caras_pintadas = false;

   int hoja_actual = encontrar_hoja(vPos);

   int cluster_actual = sMBSP.BSPLeaf[hoja_actual].cluster;

   for(i = 0; i < matConstTam[kLeafs]; i++)
   {
     if (cluster_visible(cluster_actual, sMBSP.BSPLeaf.cluster))
     {
        if(bb_frustum(sMBSP.BSPLeaf.mins,sMBSP.BSPLeaf.maxs))
         render_leaf(&sMBSP.BSPLeaf);
     }
   }

}

void render_leaf(tBSPLeaf *a)
{
   for(int i = 0; i < a->numOfLeafFaces; i++)
   {
      render_face_pvs(sMBSP.BSPLeafFaces[a->leafface + i].pLeafFaces);

   }

}



bool cluster_visible(int visCluster, int testCluster)
{

   if ((sMBSP.BSPVisData.pBitsets== NULL) || (visCluster < 0)) {
       return true;
   }

   int i = (visCluster * sMBSP.BSPVisData.bytesPerCluster) + (testCluster >> 3);
   byte visSet = sMBSP.BSPVisData.pBitsets;

   return (visSet & (1 << (testCluster & 7))) != 0;
}

El resultado de esto son unos frames por seg que se mueven entre 40-80. Si me mantengo en la zona donde empiezo los frames estan entre 120-130 pero en cuando empiezo a pasear por el mapa bajan a lo dicho anteriormente. El problema no parece estar en la función de pintar caras(no la he puesto en este post) porque si la comento no sale en pantalla nada (obviamente) pero la tasa de frames aunque sube unos 30 más o menos sigue bajando en picado cuando me muevo. Si comento la función de la caja del frustum apenas se nota.

Dónde puede estar el cuello de botella?

Muchas gracias.

Un saludo
En que estas dibujando poligono a poligono, uno por uno, y eso es mortal. Tienes que usar un vertex buffer.

misscelan

 Perdón pero es que no lo he puesto bien.

En la segunda manera utilizo glDrawArrays. Pero vamos lo que me extraña es que en la segunda manera usando pvs y frustumculling me vaya más lento que imprimirlo todo a lo bruto cuando debería ser al revés. O puede que eso sirviese sólo para tarjetas muy viejas y ahora eso sea hasta contraproducente?. Mi tarjeta no es nueva es una radeon 9200.

Muchas gracias.

Un saludo.

zupervaca

 uno a uno es lo mismo que pintarlos todos al mismo tiempo, la unica diferencia es que es que glDrawArrays usa un frustum interno, aun no he notado en ninguna tarjeta grafica esa mejora que dicen que existe

saludos

misscelan

 No me explico bien, soy un poco desastre.

Para pintar el bsp primero utilicé la forma más rápida de hacer (que no la más eficiente).

De esa manera hacía un bucle recorriendo las caras, y después otro dentro con el número de meshvertex.
Con esta manera no tuve en cuenta si había pintado o no las caras. Tampoco tenía en cuenta si algún cluster no era visible desde donde yo estaba, tampoco usaba frustum culling y además pintaba con glbegin y glend.

De la segunda manera controlo si puedo evitarme algún cluster que no se vea, miro si la cara ya había sido pintada ya, los paso por el frustum y además uso glDrawArrays y lo que no entiendo es que haciendo todo esto me vaya más lento que de la otra manera.

Pogacha

 Hay algun error en el codigo, buscalo con un Log, a ver cuantas veces se pinta una cara, cuantas veces paso por los inners-loops y demas.
Saludos.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.