- void computeVisabilityMatrix() {
- int i,j;
- int Pixel;
- int counter;
- GLuint queries[3494];
- GLint available;
- glPushMatrix();
- // enable orthographic projection
- glOrtho(0, width, height, 0, NEAR_CLIPPING_PLANE, FAR_CLIPPING_PLANE);
- glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // disable Colorbuffer
- glEnable(GL_STENCIL_TEST);
- glEnable(GL_DEPTH_TEST);
- // Query erzeugen
- glGenQueriesARB(3494, queries);
- counter = 0;
- // for all light directions j do
- for (j=0; j<nLights; j++) {
- // set camera at light direction lj
- gluLookAt(LightPositions[j][0], LightPositions[j][1], LightPositions[j][2], model->BBox->Center.x, model->BBox->Center.y, model->BBox->Center.z, 0.0f,1.0f,0.0f);
- // render object into depth buffer with polygon offset
- glEnable(GL_POLYGON_OFFSET_POINT);
- drawFirstPass();
- // for all vertices i do
- for (i=0; i<model->nVertex; i++) {
- // begin query i
- glBeginQueryARB(GL_SAMPLES_PASSED_ARB,queries[i]);
- // render vertex i
- glBegin(GL_POINTS);
- glVertex3f(model->VertexArray[i].x, model->VertexArray[i].y, model->VertexArray[i].z);
- glEnd();
- //end query i
- glEndQueryARB(GL_SAMPLES_PASSED_ARB);
- }
- // end for
- glFlush();
- // Do other work until "most" of the queries are back, to avoid
- // wasting time spinning
- i = 3494 * 3/4; // N * 3/4 instead of N-1, to prevent the GPU from going idle
- do {
- //DoSomeStuff();
- glGetQueryObjectivARB(queries[i],
- GL_QUERY_RESULT_AVAILABLE_ARB,
- &available);
- } while (!available);
- // for all vertices i do
- for (i=0; i<model->nVertex; i++) {
- // retrieve result from query i
- glGetQueryObjectivARB(queries[i],GL_QUERY_RESULT_ARB,&Pixel);
- //if result is "visible" then
- if (Pixel > 0) {
- // Mij = ni(vertex normal) ·(dot product) lj(light direction) ;lj ist wohl gleich lightposition
- VisMatrix[j][i] = model->NormalArray[i].x * LightPositions[j][0] + model->NormalArray[i].y * LightPositions[j][1] + model->NormalArray[i].z * LightPositions[j][2];
- counter++;
- } else {
- VisMatrix[j][i] = 0;
- }
- //end if
- }
- // end for
- }
- // end for
- // Query wieder freigeben
- glDeleteQueriesARB(3494, queries);
- GLErrorHandler();
- glPopMatrix();
- }