Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der...

Preview:

Citation preview

Shadow Mapping mit GLSLProgrammierübung im Rahmen der Vorlesung „Computergrafik 2"

VonFranz Peschel

Shadow Mapping mit GLSLProgrammierübung im Rahmen der Vorlesung „Computergrafik 2"

VonFranz Peschel

Shadow Mapping mit GLSLProgrammierübung im Rahmen der Vorlesung „Computergrafik 2"

VonFranz Peschel

Shadow Mapping mit GLSLProgrammierübung im Rahmen der Vorlesung „Computergrafik 2"

VonFranz Peschel

Shadow Mapping mit GLSLProgrammierübung im Rahmen der Vorlesung „Computergrafik 2"

VonFranz Peschel

Shadow Mapping mit GLSLProgrammierübung im Rahmen der Vorlesung „Computergrafik 2"

VonFranz Peschel

Shadow Mapping mit GLSLProgrammierübung im Rahmen der Vorlesung „Computergrafik 2"

VonFranz Peschel

Shadow Mapping mit GLSLProgrammierübung im Rahmen der Vorlesung „Computergrafik 2"

Idee:1. Kamera in Lichtquelle setzen

2. Z-Buffer von Lichtquelle aus in Textur kopieren

3. Projektives Texturemapping mit Tiefentextur

4. Pro Pixel echten Abstand mit Abstand aus Textur vergleichen

VonFranz Peschel

Inhalt

1. Inititialisieren (init..())

2. Zeichnen (display())

2.1 Shader

3. Zusammenfassung

Shadow Mapping – initGL()

void initGL(){

// init statesglEnable(GL_DEPTH_TEST);...

glViewport(0,0,width,height);...

gluPerspective(...);...

// initialize shadow textureinitShadowMap();

}

Shadow Mapping – initShadowMap()

void initShadowMap(){

// generate texture object glGenTextures(1, &shadowMapID);glBindTexture(GL_TEXTURE_2D, shadowMapID);

// no interpolation or repetitionglTexParameteri(...); //GL_NEAREST...glTexParameteri(...); //GL_CLAMP_TO_EDGE...

// set comparison modes (needed for shader)glTexParameteri(...); //GL_DEPTH_TEXTURE_MODEglTexParameteri(GL_TEXTURE_2D,

GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);

}

Display()void Display(){

...// Set current camera view(gluLookAt(...)) g_Camera->CamLookAt();

// Display light sourcesDisplayLightSources();

// Render Sceneg_scene()->RenderScene();

// Stop rendering into our FBOg_scene->m_renderTexture->EndRenderToFBO()

// Postprocess screen texture g_scene->PostProcessTexture();...

}

Shadow Mapping – initGLSL()

void initGLSL(){

// create vertex and fragment shader objects

...

// SOLUTION

// init uniform locations( specific for shadow mapping shader)

shadowTextureLocation = glGetUniformLocationARB( shaderProgram, "shadowTexture" );

modelMatrixLocation = glGetUniformLocationARB( shaderProgram, "modelMatrix" );

glUseProgramObjectARB( 0 );

// SOLUTION}

Inhalt

1. Inititialisieren (init..())

2. Zeichnen (display())

2.1 Shader

3. Zusammenfassung

Shadow Mapping – display()void display(){

// clear// set light parameters// render from light positioncreateShadowMap();// now render from camera viewgluLookAt(...);// activate projective texturing computationssetupTextureMatrix();

// activate shaderglUseProgram( shaderProgram );// draw all objectsdrawScene();// deactivate shaderglUseProgram( 0 );

// deactivate projective texturingresetTextureMatrix();// draw point indicating light position// increment rotation angle// swap display buffersglutSwapBuffers();

}

Shadow Mapping – createShadowMap()...

}

Shadow Mapping – createShadowMap()void createShadowMap(){

// set viewportglViewport(0, 0, shadowResolution, shadowResolution);

// set projectionglMatrixMode(GL_PROJECTION);// SOLUTION

glPushMatrix();glLoadIdentity();// parameters from light (as spotlight)gluPerspective(lightAngle, 1.0f, lightNear, lightFar);

// SOLUTION// set modelviewglMatrixMode( GL_MODELVIEW );// SOLUTION

glPushMatrix();glLoadIdentity();// look from light's positiongluLookAt(lightPosition[0], lightPosition[1],

lightPosition[2], lightDirection[0] - lightPosition[0], lightDirection[1] - lightPosition[1], lightDirection[2] - lightPosition[2],0, 1, 0 );

// SOLUTION ...

Shadow Mapping – createShadowMap()...// enable polygon offsetsglEnable(GL_POLYGON_OFFSET_FILL);glPolygonOffset(offsetFactor, offsetUnits);

// draw contentdrawScene();

// copy from z-buffer into textureglBindTexture(GL_TEXTURE_2D, shadowMapID); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, shadowResolution, shadowResolution, 0);

// deactivate offsettingglDisable(GL_POLYGON_OFFSET_FILL);

// reset viewportglViewport(0, 0, width, height);

// reset projection/modelview matricesglMatrixMode( GL_PROJECTION ); glPopMatrix();glMatrixMode( GL_MODELVIEW );glPopMatrix();

// clearglClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );

}

Shadow Mapping – createShadowMap()...

}

Shadow Mapping – createShadowMap()...

}

Shadow Mapping – createShadowMap()...

}

Shadow Mapping – createShadowMap()...

}

Shadow Mapping – setupTextureMatrix()void setupTextureMatrix(){

// set up texture matrix (used by shader)glMatrixMode(GL_TEXTURE);// SOLUTION

glLoadIdentity();

// scale-bias componentsglTranslatef(0.5f, 0.5f, 0.5f); glScalef(0.5f, 0.5f, 0.5f);

// projectiongluPerspective(lightAngle, 1.0f, lightNear,lightFar);

// modelviewgluLookAt(lightPosition[0], lightPosition[1],

lightPosition[2], lightDirection[0] - lightPosition[0], lightDirection[1] - lightPosition[1], lightDirection[2] - lightPosition[2],0, 1, 0 );

// SOLUTION// change matrix stackglMatrixMode(GL_MODELVIEW);

}

Display()void Display(){

...// Set current camera view(gluLookAt(...)) g_Camera->CamLookAt();

// Display light sourcesDisplayLightSources();

// Render Sceneg_scene()->RenderScene();

// Stop rendering into our FBOg_scene->m_renderTexture->EndRenderToFBO()

// Postprocess screen texture g_scene->PostProcessTexture();...

}

Inhalt

1. Inititialisieren (init..())

2. Zeichnen (display())

2.1 Shader

3. Zusammenfassung

Display()void Display(){

...// Set current camera view(gluLookAt(...)) g_Camera->CamLookAt();

// Display light sourcesDisplayLightSources();

// Render Sceneg_scene()->RenderScene();

// Stop rendering into our FBOg_scene->m_renderTexture->EndRenderToFBO()

// Postprocess screen texture g_scene->PostProcessTexture();...

}

Shadow Mapping – Vertex Shaderuniform mat4 modelMatrix; // matrix for modeling transform (without view)varying vec4 shadowCoord; // variable for shadow lookup coordinatesvarying vec4 position;varying vec3 normal;

void main(){

// compute coordinates from current texture matrix (scale-bias + lightMVP) // and model („Light space openGL-pipeline“) shadowCoord = gl_TextureMatrix[0] * modelMatrix * gl_Vertex;

// Phong shading: store vertex attributes in world coordinatesposition = gl_ModelViewMatrix * gl_Vertex;normal = gl_NormalMatrix * gl_Normal;

// vec3 N = normalize( gl_NormalMatrix * gl_Normal );// vec3 L = normalize( gl_LightSource[0].position - gl_ModelViewMatrix *gl_Vertex ).xyz;

// transform vertex// gl_FrontColor = gl_FrontMaterial.diffuse * max( 0.0, dot( N, L ) );gl_Position = ftransform();

}

Display()void Display(){

...// Set current camera view(gluLookAt(...)) g_Camera->CamLookAt();

// Display light sourcesDisplayLightSources();

// Render Sceneg_scene()->RenderScene();

// Stop rendering into our FBOg_scene->m_renderTexture->EndRenderToFBO()

// Postprocess screen texture g_scene->PostProcessTexture();...

}

Shadow Mapping – Fragment Shaderuniform sampler2DShadow shadowTexture; // shadow mapvarying vec4 shadowCoord; // interpolated shadow texture coordinatesvarying vec4 position;varying vec3 normal;

void main(){

float depth = 0.0;// avoid back-projection (shadowCoord.w negative)if ( shadowCoord.w > 0.0 )

// compare grey-value in shadow map with projected depth-value of shadorCoord// if (shadowmap depth value >= shadowCoord depth value) depth = 1.0 (no shadow)// else depth is something unequal 1.0 (shadow)(see GL_TEXTURE_COMPARE_FUNC)depth = shadow2DProj( shadowTexture, shadowCoord ).r;

// set shade factorfloat shadeFactor = depth != 1.0 ? 0.5 : 1.0;

// compute phong shadingvec3 N = normalize( normal );vec3 L = normalize( gl_LightSource[0].position.xyz - position.xyz );float attenuation = max( 0.0, dot( N, L ) );// compute colorvec4 color = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse * attenuation;

// weight final colorgl_FragColor = color * shadeFactor; // gl_Color * shadeFactor;

}

Shadow Mapping – Fragment Shader

// Aufgabe 2.2: avoid back-projection (shadowCoord.w negative)if ( shadowCoord.w > 0.0 )

// compare ZA and ZBdepth = shadow2DProj( shadowTexture, shadowCoord ).r;

Shadow Mapping – Fragment Shadervoid drawScene(){

...// first objectglPushMatrix();// local transforms (in addition to current view transform)glTranslatef(0.0, 1.0, 0.0);glRotatef( alpha, 0.0, 1.0, 0.0 );// SOLUTION

// get local model transformsglPushMatrix();// reset stackglLoadIdentity();// same transformsglTranslatef( 0.0, 1.0, 0.0 );glRotatef( alpha, 0.0, 1.0, 0.0 );// readglGetFloatv( GL_MODELVIEW_MATRIX, modelMatrix );// transfer to shader (as uniform variable)glUniformMatrix4fv( modelMatrixLocation, 1, GL_FALSE, modelMatrix );// resetglPopMatrix();

// SOLUTION// draw objectglutSolidTorus( 0.2, 0.7, 24, 32 );// doneglPopMatrix(); ...

Shadow Mapping – resetTextureMatrix()void resetTextureMatrix(){

// clear texture matrixglMatrixMode(GL_TEXTURE);glLoadIdentity();

// change matrix stackglMatrixMode(GL_MODELVIEW);

}

Inhalt

1. Inititialisieren (init..())

2. Zeichnen (display())

2.1 Shader

3. Zusammenfassung

Zusammenfassung Shadow Mapping Ablauf visualisiert:

1. Sicht Kamera: Szene ohne Schatten

2. Sicht Lichtquelle: Szene

3. Sicht Lichtquelle:Shadow Map (Depth Map)

4. Sicht Kamera:projezierte Shadow Map,Z-Wert (ZA) in Shadow Map an der Stelle (s/q),(t/q)

5. Sicht Kamera: Z-Wert im Light Space des Fragments (ZB)

6. Sicht Kamera:Szene mit Schatten nach dem Tiefentest zwischen 4. Und 5.

1. 2.

3. 4.

5. 6.

Bild: http://www.devmaster.net/articles/shadow_techniques

Zusammenfassung 1. 2.

3. 4.

5. 6.

2. and 3.

4. and 5.

Bild: http://www.devmaster.net/articles/shadow_techniques

Ergebnis

Ohne Shadow Mapping Mit Shadow MappingPer-Vertex Lighting Per-Pixel Lighting (Phong Shading)

Fragen...

Ende

Recommended