Archived

This topic is now archived and is closed to further replies.

kapru

Frustum Culling

Recommended Posts

kapru    100
Has any one got some really good culling code they would like to share? Ive been trying for ages to get mine working. Ive been working off the sdk example and for some reason nothing wants to draw when i cull test

Share this post


Link to post
Share on other sites
SimDemon    122
I''ve been having the same trouble. I can''t find anything that works properly. Check a couple pages back (pages 2-4) for one of my posts. It has my code for the frustum culling. I don''t know that it will help, but it should. It works somewhat for me. I just don''t have the correct function for checking spheres, boxes, etc. against the frustum planes.

Share this post


Link to post
Share on other sites
kapru    100
Ive extracted the planes properly but am having trouble checking if a box is inside outside or contains the frustum

Here's what i got

Ive got the frustum planes transformed into world space
And the 8 points of the containing box in world space

[edited by - kapru on March 27, 2004 11:44:20 PM]

Share this post


Link to post
Share on other sites
kapru    100
here''s the source to what im doing

//check if the 8 points are within the frustum

int cTerrainEngine::TerrainCullPatch(sTerrainPatch *p)
{
int PointsIn = 0;

for(int plane=0;plane<6;plane++)
{
int InCount = 8;
int PtIn = 1;
for(int i=0;i<8;i++)
{
//Check to see if the point is on the +ve side for the plane

float s = planeFrustum[plane].a*p->BoundingCube[i].x +
planeFrustum[plane].b*p->BoundingCube[i].y +
planeFrustum[plane].c*p->BoundingCube[i].x +
planeFrustum[plane].d;
/*
if s is over 0 the point is on the +ve side of the plane
if s is under 0 the point is on the -ve side of the plane
if s is 0 the point is on the plane
*/

if(s<0)
{
PtIn = 0;
InCount--;
}
}
if(InCount==0) return 0;
PointsIn +=InCount;
}
if(PointsIn==6) return 1;

return 2;//Probably an intersection

}

Extract the Frustum planes

cTerrainEngine::CreateTerrainFrustum(LPDIRECT3DDEVICE8 device)
{

D3DXMATRIX matView;
D3DXMATRIX matProj;
D3DXMATRIX mat;

device->GetTransform(D3DTS_VIEW,&matView);
device->GetTransform(D3DTS_PROJECTION,&matProj);

D3DXMatrixMultiply( &mat, &matView, &matProj );
D3DXMatrixInverse( &mat, NULL, &mat );

planeFrustum[0].a = mat._14 + mat._11;
planeFrustum[0].b = mat._24 + mat._21;
planeFrustum[0].c = mat._34 + mat._31;
planeFrustum[0].d = mat._44 + mat._41;

planeFrustum[1].a = mat._14 - mat._11;
planeFrustum[1].b = mat._24 - mat._21;
planeFrustum[1].c = mat._34 - mat._31;
planeFrustum[1].d = mat._44 - mat._41;

planeFrustum[2].a = mat._14 - mat._12;
planeFrustum[2].b = mat._24 - mat._22;
planeFrustum[2].c = mat._34 - mat._32;
planeFrustum[2].d = mat._44 - mat._42;

planeFrustum[3].a = mat._14 + mat._12;
planeFrustum[3].b = mat._24 + mat._22;
planeFrustum[3].c = mat._34 + mat._32;
planeFrustum[3].d = mat._44 + mat._42;

planeFrustum[4].a = mat._13;
planeFrustum[4].b = mat._23;
planeFrustum[4].c = mat._33;
planeFrustum[4].d = mat._43;

planeFrustum[5].a = mat._14 - mat._13;
planeFrustum[5].b = mat._24 - mat._23;
planeFrustum[5].c = mat._34 - mat._33;
planeFrustum[5].d = mat._44 - mat._43;

for(int i=0;i<6;i++)
D3DXPlaneNormalize(&planeFrustum[i],&planeFrustum[i]);
}

Share this post


Link to post
Share on other sites
critical    122
maybe you should also add the world matrix and multiply it to the projection and view matrix, maybe than it works... (in my app it works then...)

Share this post


Link to post
Share on other sites