PMG https://forum.pmg.org.ru/ |
|
Тени https://forum.pmg.org.ru/viewtopic.php?f=1&t=9434 |
Страница 1 из 1 |
Автор: | RomaSoft [ 24 ноя 2012 11:47 ] |
Заголовок сообщения: | Тени |
Привет. У меня проблема, какой уже месяц бьюсь. Сделал 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); } |
Автор: | RomaSoft [ 24 ноя 2012 13:27 ] |
Заголовок сообщения: | Re: Тени |
Вот сам 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. Помогите решить проблему, что мне с этим делать. |
Автор: | sinus [ 27 ноя 2012 15:37 ] |
Заголовок сообщения: | Re: Тени |
А можно рабочую программку, чтоб оценить как у меня упадёт fps... |
Автор: | MagicWolf [ 03 дек 2012 13:29 ] |
Заголовок сообщения: | Re: Тени |
Надо делать профилинг (http://ru.wikipedia.org/wiki/Профилирование_(информатика)) и удаленную отладку. Профилинг с регистрацией времени выполнения кусков кода, а удаленная отладка, чтобы минимизировать влияния среды компилятора на работу программы. Но лично я всегда делал профилинг, просто вставляя в код вывод в лог меток времени... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |