PMG

Форумы по созданию игр
Текущее время: 28 мар 2024 19:38

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Тени
СообщениеДобавлено: 24 ноя 2012 11:47 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 06 ноя 2011 14:35
Сообщения: 7
Привет.
У меня проблема, какой уже месяц бьюсь.
Сделал Shadow Volumes, проблема в том, что при наведении камеры на тень FPS падает с 490 до 30.Когда
поворачиваю камеру в сторону от тени то FPS опять повышается до 490.
Пробовал использовать glVertex3fv,glDrawArrays,VBO - Результат тот же.

Вот код:
Код:

void CShadow::SetConnectivity()
{
   unsigned int i,j,ki,kj;
   for(unsigned int m=0;m<numMap;m++)
   {
      for(i=0;i<shadowMap[m].numFaces-1;i++)
         for(j=i+1;j<shadowMap[m].numFaces;j++)
            for(ki=0;ki<3;ki++)
               if(!shadowMap[m].Plane[i].neigh[ki])
               {
                  for(kj=0;kj<3;kj++)
                  {
                     int a1 = shadowMap[m].Plane[i].p[ki];
                     int a2 = shadowMap[m].Plane[i].p[(ki+1)%3];
                     int b1 = shadowMap[m].Plane[j].p[kj];
                     int b2 = shadowMap[m].Plane[j].p[(kj+1)%3];
                     if((a1==b1 && a2==b2)||(a1==b2 && a2==b1))
                     {
                        shadowMap[m].Plane[i].neigh[ki] = kj;
                        shadowMap[m].Plane[j].neigh[kj] = ki;
                     }
                  }
               }
   }
}

std::vector<CVector3>vert;
void CShadow::DrawShadowVolume(SMesh *mesh,unsigned int m,bool caps)
{
   CVector3 v1,v2,v3,v4,ls;
   unsigned int i;
   int j;
   ls = light * 10000.0f;
   vert.clear();

   for(i=0;i<shadowMap[m].numFaces;i++)
   {
      //////////////////////////////////////////////////////////////////////////
      shadowMap[m].Plane[i].planeEq.CalcPlane(mesh->pVert[mesh->pFaces[i].face[0]],
                           mesh->pVert[mesh->pFaces[i].face[1]],
                           mesh->pVert[mesh->pFaces[i].face[2]]);
      float side = shadowMap[m].Plane[i].planeEq[0] * light[0] +
          shadowMap[m].Plane[i].planeEq[1] * light[1] +
          shadowMap[m].Plane[i].planeEq[2] * light[2] +
          shadowMap[m].Plane[i].planeEq[3];
      if(side > 0)
         shadowMap[m].Plane[i].visible = true;
      else
         shadowMap[m].Plane[i].visible = false;
      //////////////////////////////////////////////////////////////////////////
      if(!shadowMap[m].Plane[i].visible)
         continue;
      for(j=0;j<3;j++)
      {
         int k = shadowMap[m].Plane[i].neigh[j];
         if(k==-1 || shadowMap[m].Plane[k].visible==false)
         {
            v1 = mesh->pVert[shadowMap[m].Plane[i].p[j]];
            v2 = mesh->pVert[shadowMap[m].Plane[i].p[(j+1)%3]];
            v3 = v1 - ls;
            v4 = v2 - ls;
            vert.push_back(v1);
            vert.push_back(v3);
            vert.push_back(v2);
            vert.push_back(v2);
            vert.push_back(v3);
            vert.push_back(v4);
         }
      }
      if(caps)
      {
         for(j=0;j<3;j++)
         {
            v1 = mesh->pVert[shadowMap[m].Plane[i].p[j]];
            v2 = v1 - ls;
            if(shadowMap[m].Plane[i].visible)
               vert.push_back(v1);
            else
               vert.push_back(v2);
         }
      }
   }

   glEnableClientState(GL_VERTEX_ARRAY);
   glVertexPointer(3, GL_FLOAT, 0, &vert[0]);
   glDrawArrays(GL_TRIANGLES, 0, vert.size());
   glDisableClientState(GL_VERTEX_ARRAY);
}



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тени
СообщениеДобавлено: 24 ноя 2012 13:27 
Не в сети
Новичок
Аватара пользователя

Зарегистрирован: 06 ноя 2011 14:35
Сообщения: 7
Вот сам render тени.

Код:

void CShadow::RenderShadow()
{
   for(unsigned int m=0;m<pObj->pMesh.size();m++)
   {
      SMesh *mesh = pObj->pMesh[m];
      DrawShadowVolume(mesh,m,true);
   }
}

void CShadowVolume::Render()
{
   glPushAttrib(GL_ENABLE_BIT);

   glDisable(GL_LIGHTING);
   glDisable(GL_FOG);
   glDepthFunc(GL_LEQUAL);
   glDepthMask(GL_FALSE);
   glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE);
   glEnable(GL_STENCIL_TEST);
   glEnable(GL_POLYGON_OFFSET_FILL);
   glPolygonOffset(0.0f,1.0f);

   glDisable(GL_CULL_FACE);
   glStencilFunc( GL_ALWAYS, 0, ~0 );
   glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_INCR_WRAP, GL_KEEP);
   glStencilOpSeparate(GL_BACK, GL_KEEP, GL_DECR_WRAP, GL_KEEP);

   for(unsigned int i=0;i<pShadow.size();i++)
      pShadow[i]->RenderShadow();
   
   glDisable(GL_POLYGON_OFFSET_FILL);
   glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   glStencilFunc(GL_NOTEQUAL,0,~0);
   glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

   glPushMatrix();
   glLoadIdentity();
   glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
   glBegin(GL_TRIANGLE_STRIP);
   glVertex3f(-0.1f, 0.1f,-0.1f);
   glVertex3f(-0.1f,-0.1f,-0.1f);
   glVertex3f( 0.1f, 0.1f,-0.1f);
   glVertex3f( 0.1f,-0.1f,-0.1f);
   glEnd();
   glPopMatrix();

   glPopAttrib();
}



Я думаю что проблема где то здесь, если я сделаю так:

Код:
void CShadowVolume::Render()
{
   glPushAttrib(GL_ENABLE_BIT);

/*   glDisable(GL_LIGHTING);
   glDisable(GL_FOG);
   glDepthFunc(GL_LEQUAL);
   glDepthMask(GL_FALSE);
   glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE);
   glEnable(GL_STENCIL_TEST);
   glEnable(GL_POLYGON_OFFSET_FILL);
   glPolygonOffset(0.0f,1.0f);

   glDisable(GL_CULL_FACE);
   glStencilFunc( GL_ALWAYS, 0, ~0 );
   glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_INCR_WRAP, GL_KEEP);
   glStencilOpSeparate(GL_BACK, GL_KEEP, GL_DECR_WRAP, GL_KEEP);*/

   for(unsigned int i=0;i<pShadow.size();i++)
      pShadow[i]->RenderShadow();
   
/*   glDisable(GL_POLYGON_OFFSET_FILL);
   glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   glStencilFunc(GL_NOTEQUAL,0,~0);
   glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

   glPushMatrix();
   glLoadIdentity();
   glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
   glBegin(GL_TRIANGLE_STRIP);
   glVertex3f(-0.1f, 0.1f,-0.1f);
   glVertex3f(-0.1f,-0.1f,-0.1f);
   glVertex3f( 0.1f, 0.1f,-0.1f);
   glVertex3f( 0.1f,-0.1f,-0.1f);
   glEnd();
   glPopMatrix();*/

   glPopAttrib();
}


то FPS не так круто подает, до 300. Помогите решить проблему, что мне с этим делать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тени
СообщениеДобавлено: 27 ноя 2012 15:37 
Не в сети
Любитель

Зарегистрирован: 27 апр 2012 18:48
Сообщения: 39
А можно рабочую программку, чтоб оценить как у меня упадёт fps...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тени
СообщениеДобавлено: 03 дек 2012 13:29 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Надо делать профилинг (http://ru.wikipedia.org/wiki/Профилирование_(информатика)) и удаленную отладку.
Профилинг с регистрацией времени выполнения кусков кода, а удаленная отладка, чтобы минимизировать влияния среды компилятора на работу программы.
Но лично я всегда делал профилинг, просто вставляя в код вывод в лог меток времени...

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB