Hardware occlusion query type
BlitzMax Forums/OpenGL Module/Hardware occlusion query type
| ||
This code will handle hardware occlusion queries. Usage: If TQuery.supported() query:TQuery=New TQuery query.beginquery() draw stuff query.endquery() Wait a few frames, so a GPU sync isn't forced (use the time value to see how long ago the query was performed)... if query.available() result=query.getqueryresult() endif It's kind of useless, and I have not gained much performance from this approach, and in some cases it makes things slower, but it is good for very expensive objects, like animated meshes and lights. Strict Import pub.opengl Import leadwerks.glewex Type TQuery Field id Field _available=0 Field result=-1 Field pixels=10 Method New() glGenQueriesARB 1,Varptr id EndMethod Method Delete() glDeleteQueriesARB 1,Varptr id EndMethod Method BeginQuery() glColorMask 0,0,0,0 gldepthmask 0 gldisable GL_CULL_FACE glBeginQueryARB GL_SAMPLES_PASSED_ARB,id EndMethod Method EndQuery() glEndQueryARB GL_SAMPLES_PASSED_ARB glenable GL_CULL_FACE glColorMask 1,1,1,1 gldepthmask 1 EndMethod Method Available:Int() If _available Return 1 glGetQueryObjectivARB(id,GL_QUERY_RESULT_AVAILABLE_ARB,Varptr _available) Return _available EndMethod Method GetQueryResult() If Not Available() Return 0 Select result Case 1 Return 1 Case 0 Return 0 Case -1 Local bits glGetQueryObjectuivARB id,GL_QUERY_RESULT_ARB,Varptr bits If bits<pixels result=0 Else result=1 Return result EndSelect EndMethod Function Supported:Int() Global support Select support Case -1 Return 0 Case 1 Return 1 Case 0 Local extensionstring$=String.FromCString( glGetString( GL_EXTENSIONS ) ) If extensionstring.find("GL_ARB_occlusion_query")>-1 support=1 Else support=-1 Return support EndSelect EndFunction EndType |