Hello, Ive been working on an Occlusion culler that uses opengl's occlusion queries
although when I render the scene meshes can occlude meshes but when models are in front of each other they still render.
here is the code
void renderer::draw()
{
for( int m = 0; m < renderer::meshes.size(); m++ )
{
glPushMatrix();
if(renderer::meshes[m].yaw != 0 )
glRotatef(renderer::meshes[m].yaw,1.0,0.0,0.0);
if(renderer::meshes[m].pitch != 0 )
glRotatef(renderer::meshes[m].pitch,0.0,1.0,0.0);
if(renderer::meshes[m].roll != 0 )
glRotatef(renderer::meshes[m].roll,0.0,0.0,1.0);
if((renderer::meshes[m].scaley != 1)&&(renderer::meshes[m].scaley != 1)&&(renderer::meshes[m].scalez != 1))
glScalef(renderer::meshes[m].scaley,renderer::meshes[m].scaley,renderer::meshes[m].scalez);
if((renderer::meshes[m].x != 0)&&(renderer::meshes[m].y != 0)&&(renderer::meshes[m].z != 0))
glTranslatef(renderer::meshes[m].x,renderer::meshes[m].y,renderer::meshes[m].z);
for( int l = 0; l < renderer::meshes[m].trislists.size(); l++ )
{
glGenQueriesARB( 1, &renderer::meshes[m].trislists[l].query );
glBeginQueryARB( GL_SAMPLES_PASSED_ARB, renderer::meshes[m].trislists[l].query);
for( int t = 0; t < renderer::meshes[m].trislists[l].tris.size(); t++ )
{
drawtriangle(renderer::meshes[m].trislists[l].tris[t]);
}
glEndQueryARB( GL_SAMPLES_PASSED_ARB );
}
glPopMatrix();
}
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
for( int m = 0; m < renderer::meshes.size(); m++ )
{
for( int l = 0; l < renderer::meshes[m].trislists.size(); l++ )
{
glGetQueryObjectuivARB( renderer::meshes[m].trislists[l].query, GL_QUERY_RESULT_ARB, &renderer::meshes[m].trislists[l].fragmentcount);
}
}
for( int m = 0; m < renderer::meshes.size(); m++ )
{
glPushMatrix();
if(renderer::meshes[m].yaw != 0 )
glRotatef(renderer::meshes[m].yaw,1.0,0.0,0.0);
if(renderer::meshes[m].pitch != 0 )
glRotatef(renderer::meshes[m].pitch,0.0,1.0,0.0);
if(renderer::meshes[m].roll != 0 )
glRotatef(renderer::meshes[m].roll,0.0,0.0,1.0);
if((renderer::meshes[m].scaley != 1)&&(renderer::meshes[m].scaley != 1)&&(renderer::meshes[m].scalez != 1))
glScalef(renderer::meshes[m].scaley,renderer::meshes[m].scaley,renderer::meshes[m].scalez);
if((renderer::meshes[m].x != 0)&&(renderer::meshes[m].y != 0)&&(renderer::meshes[m].z != 0))
glTranslatef(renderer::meshes[m].x,renderer::meshes[m].y,renderer::meshes[m].z);
for( int l = 0; l < renderer::meshes[m].trislists.size(); l++ )
{
if(renderer::meshes[m].trislists[l].fragmentcount != 0 )
{
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
//draw
for( int t = 0; t < renderer::meshes[m].trislists[l].tris.size(); t++ )
{
drawtriangle(renderer::meshes[m].trislists[l].tris[t]);
}
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
}
}
glPopMatrix();
}
//clear
renderer::meshes.clear();
}