void ChangeSize(int w, int h) { GLint i; windowWidth = shadowWidth = w; windowHeight = shadowHeight = h; if (!npotTexturesAvailable) { // Find the largest power of two that will fit in window. // Try each width until we get one that's too big i = 0; while ((1 << i) <= shadowWidth) i++; shadowWidth = (1 << (i-1)); // Now for height i = 0; while ((1 << i) <= shadowHeight) i++; shadowHeight = (1 << (i-1)); } if (shadowWidth > maxTexSize) { shadowWidth = maxTexSize; } if (shadowHeight > maxTexSize) { shadowHeight = maxTexSize; } RegenerateShadowMap(); }
void SpecialKeys(int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: if (controlCamera) cameraPos[0] -= 5.0f; else lightPos[0] -= 5.0f; break; case GLUT_KEY_RIGHT: if (controlCamera) cameraPos[0] += 5.0f; else lightPos[0] += 5.0f; break; case GLUT_KEY_UP: if (controlCamera) cameraPos[2] -= 5.0f; else lightPos[2] -= 5.0f; break; case GLUT_KEY_DOWN: if (controlCamera) cameraPos[2] += 5.0f; else lightPos[2] += 5.0f; break; default: break; } // We don't need to regenerate the shadow map // if only the camera angle changes if (!controlCamera) RegenerateShadowMap(); // Refresh the Window glutPostRedisplay(); }
// This function does any needed initialization on the rendering // context. void SetupRC() { fprintf(stdout, "Shadow Mapping Demo\n\n"); // Make sure required functionality is available! if (!GLEE_VERSION_1_4 && !GLEE_ARB_shadow) { fprintf(stderr, "Neither OpenGL 1.4 nor GL_ARB_shadow" " extension is available!\n"); Sleep(2000); exit(0); } // Check for optional extensions if (GLEE_ARB_shadow_ambient) { ambientShadowAvailable = GL_TRUE; } else { fprintf(stderr, "GL_ARB_shadow_ambient extension not available!\n"); fprintf(stderr, "Extra ambient rendering pass will be required.\n\n"); Sleep(2000); } if (GLEE_VERSION_2_0 || GLEE_ARB_texture_non_power_of_two) { npotTexturesAvailable = GL_TRUE; } else { fprintf(stderr, "Neither OpenGL 2.0 nor GL_ARB_texture_non_power_of_two extension\n"); fprintf(stderr, "is available! Shadow map will be lower resolution (lower quality).\n\n"); Sleep(2000); } glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize); fprintf(stdout, "Controls:\n"); fprintf(stdout, "\tRight-click for menu\n\n"); fprintf(stdout, "\tx/X\t\tMove +/- in x direction\n"); fprintf(stdout, "\ty/Y\t\tMove +/- in y direction\n"); fprintf(stdout, "\tz/Z\t\tMove +/- in z direction\n\n"); fprintf(stdout, "\tf/F\t\tChange polygon offset factor +/-\n\n"); fprintf(stdout, "\tq\t\tExit demo\n\n"); // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); // Hidden surface removal glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glPolygonOffset(factor, 0.0f); // Set up some lighting state that never changes glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glEnable(GL_NORMALIZE); glEnable(GL_LIGHT0); // Set up some texture state that never changes glGenTextures(1, &shadowTextureID); glBindTexture(GL_TEXTURE_2D, shadowTextureID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); if (ambientShadowAvailable) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FAIL_VALUE_ARB, 0.5f); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); RegenerateShadowMap(); }
void KeyPressFunc(unsigned char key, int x, int y) { switch (key) { case 'f': factor++; glPolygonOffset(factor, 0.0f); RegenerateShadowMap(); break; case 'F': factor--; glPolygonOffset(factor, 0.0f); RegenerateShadowMap(); break; case 'x': if (controlCamera) cameraPos[0] += 5.0f; else lightPos[0] += 5.0f; break; case 'X': if (controlCamera) cameraPos[0] -= 5.0f; else lightPos[0] -= 5.0f; break; case 'y': if (controlCamera) cameraPos[1] += 5.0f; else lightPos[1] += 5.0f; break; case 'Y': if (controlCamera) cameraPos[1] -= 5.0f; else lightPos[1] -= 5.0f; break; case 'z': if (controlCamera) cameraPos[2] += 5.0f; else lightPos[2] += 5.0f; break; case 'Z': if (controlCamera) cameraPos[2] -= 5.0f; else lightPos[2] -= 5.0f; break; case 'q': case 'Q': case 27 : /* ESC */ exit(0); } // We don't need to regenerate the shadow map // if only the camera angle changes if (!controlCamera) RegenerateShadowMap(); // Refresh the Window glutPostRedisplay(); }
void myDisplay() { RegenerateShadowMap(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (double)gWinWidth/(double)gWinHeight, 0.1, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); caculateCameraView(gViewMode); camera.view(); glViewport(0, 0, gWinWidth, gWinHeight); glPushMatrix(); glTranslatef(lightPosition[0], lightPosition[1], lightPosition[2]); glColor3ub(255, 255, 40); gluSphere(gluNewQuadric(), 1.0, 60, 60); glPopMatrix(); //------------------------------------------------------------------ // Track light position glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Because there is no support for an "ambient" // shadow compare fail value, we'll have to // draw an ambient pass first... glLightfv(GL_LIGHT0, GL_AMBIENT, lowAmbient); glLightfv(GL_LIGHT0, GL_DIFFUSE, lowDiffuse); // Draw objects in the scene draw(); glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); // Set up shadow comparison glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); // Enable alpha test so that shadowed fragments are discarded glAlphaFunc(GL_GREATER, 0.9f); glEnable(GL_ALPHA_TEST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Set up the eye plane for projecting the shadow map on the scene glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_R); glEnable(GL_TEXTURE_GEN_Q); glTexGenfv(GL_S, GL_EYE_PLANE, sPlane); glTexGenfv(GL_T, GL_EYE_PLANE, tPlane); glTexGenfv(GL_R, GL_EYE_PLANE, rPlane); glTexGenfv(GL_Q, GL_EYE_PLANE, qPlane); // Draw objects in the scene draw(); glDisable(GL_ALPHA_TEST); glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); glDisable(GL_TEXTURE_GEN_Q); // Flush drawing commands glutSwapBuffers(); }