#### Archived

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

# Frustum Culling

This topic is 5369 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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 on other sites
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 on other sites
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 on other sites
Oh, I see now. Well, I just thought I would offer what help/advice I could.

##### Share on other sites
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]);}

bump

##### Share on other sites
Still cant get it working

##### Share on other sites
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 on other sites
Any chance u can post some code? ive been stuck on this too long

nother bump

1. 1
2. 2
3. 3
Rutin
15
4. 4
khawk
14
5. 5
frob
12

• 9
• 11
• 11
• 23
• 12
• ### Forum Statistics

• Total Topics
633662
• Total Posts
3013231
×