Esempio n. 1
0
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();
}
Esempio n. 2
0
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();
}
Esempio n. 3
0
// 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();
}
Esempio n. 4
0
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();
}
Esempio n. 5
0
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();
}