Problem mit Shadowmapping



  • Hi Leute,

    hab ein problem beim shadowmapping und frage euch woran das liegen könnte.
    der screen ist hier:
    http://img409.imageshack.us/my.php?image=screenlz5.png

    erst dachte ich dass das selbstschattierung ist, aber der cube wirft seinen schatten auch auf den ring, kann mir jemand helfen?

    ich poste mal n bissl code 😉 :

    void
    init( void )
    {
        GLfloat  white[] = { 1.0, 1.0, 1.0, 1.0 };
    
        glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 
      		  SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, 0,
    		  GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL );
    
        glLightfv( GL_LIGHT0, GL_POSITION, lightPos );
        glLightfv( GL_LIGHT0, GL_SPECULAR, white );
        glLightfv( GL_LIGHT0, GL_DIFFUSE, white );
    
        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_TEXTURE_COMPARE_FUNC, GL_LEQUAL );
        glTexParameteri( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,
    		     GL_COMPARE_R_TO_TEXTURE );
    
        glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
        glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
        glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
        glTexGeni( GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
    
        glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
    
        glCullFace( GL_BACK );
    
        glEnable( GL_DEPTH_TEST );
        glEnable( GL_LIGHT0 );
        glEnable( GL_LIGHTING );
        glEnable( GL_TEXTURE_2D );
        glEnable( GL_TEXTURE_GEN_S );
        glEnable( GL_TEXTURE_GEN_T );
        glEnable( GL_TEXTURE_GEN_R );
        glEnable( GL_TEXTURE_GEN_Q );
        glEnable( GL_COLOR_MATERIAL );
        glEnable( GL_CULL_FACE );
    }
    
    void
    generateShadowMap( void )
    {
        GLint    viewport[4];
        GLfloat  lightPos[4];
    
        glGetLightfv( GL_LIGHT0, GL_POSITION, lightPos );
        glGetIntegerv( GL_VIEWPORT, viewport );
    
        glViewport( 0, 0, SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT );
    
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    
        glMatrixMode( GL_PROJECTION );
        glPushMatrix(); {
    	glLoadIdentity();
    	gluPerspective( 80.0, 1.0, 10.0, 1000.0 );
    	glMatrixMode( GL_MODELVIEW );
    
    	glPushMatrix(); {
    	    glLoadIdentity();
    	    gluLookAt( lightPos[0], lightPos[1], lightPos[2],
    		       lookat[0], lookat[1], lookat[2],
    		       up[0], up[1], up[2] );
    
    	    drawObjects( GL_TRUE );
    
    	} glPopMatrix();
    	glMatrixMode( GL_PROJECTION );
        } glPopMatrix();
        glMatrixMode( GL_MODELVIEW );
    
        glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0,
    		      SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, 0 );
    
        glViewport( viewport[0], viewport[1], viewport[2], viewport[3] );
    
        if ( showShadow ) {
    	GLfloat depthImage[SHADOW_MAP_WIDTH][SHADOW_MAP_HEIGHT];
    	glReadPixels( 0, 0, SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, 
    		      GL_DEPTH_COMPONENT, GL_FLOAT, depthImage );
    	glRasterPos2f( viewport[2]/2, 0 );
    	glDrawPixels( SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, GL_LUMINANCE, 
    		      GL_FLOAT, depthImage );
    	glutSwapBuffers();
        }
    }
    
    void
    generateTextureMatrix( void )
    {
        GLfloat  tmpMatrix[16];
    
        glPushMatrix(); {
    	glLoadIdentity();
    	glTranslatef( 0.5, 0.5, 0.0 );
    	glScalef( 0.5, 0.5, 1.0 );
    	gluPerspective( 60.0, 1.0, 1.0, 1000.0 );
    	gluLookAt( lightPos[0], lightPos[1], lightPos[2],
    		   lookat[0], lookat[1], lookat[2],
    		   up[0], up[1], up[2] );
    	glGetFloatv( GL_MODELVIEW_MATRIX, tmpMatrix );
        } glPopMatrix();
    
        transposeMatrix( tmpMatrix );
    
        glTexGenfv( GL_S, GL_OBJECT_PLANE, &tmpMatrix[0] );
        glTexGenfv( GL_T, GL_OBJECT_PLANE, &tmpMatrix[4] );
        glTexGenfv( GL_R, GL_OBJECT_PLANE, &tmpMatrix[8] );
        glTexGenfv( GL_Q, GL_OBJECT_PLANE, &tmpMatrix[12] );
    }
    

    mfg Oermel


  • Mod

    vertausch mal zeile 99 und 100



  • hmm... dann kommt kein schatten mehr



  • habs, thx auf den hinweis, hab mit den beiden zeilen rumgespielt 🙂

    EDIT: nu funktioniert das so: glTranslatef( 0.3, 0.3, 0.0 );
    ohne glscale()


Anmelden zum Antworten