38
Shadow Mapping mit GLSL Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Von Franz Peschel

Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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

VonFranz Peschel

Page 2: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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

VonFranz Peschel

Page 3: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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

VonFranz Peschel

Page 4: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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

VonFranz Peschel

Page 5: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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

VonFranz Peschel

Page 6: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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

VonFranz Peschel

Page 7: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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

VonFranz Peschel

Page 8: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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

Page 9: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Inhalt

1. Inititialisieren (init..())

2. Zeichnen (display())

2.1 Shader

3. Zusammenfassung

Page 10: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Shadow Mapping – initGL()

void initGL(){

// init statesglEnable(GL_DEPTH_TEST);...

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

gluPerspective(...);...

// initialize shadow textureinitShadowMap();

}

Page 11: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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);

}

Page 12: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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();...

}

Page 13: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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}

Page 14: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Inhalt

1. Inititialisieren (init..())

2. Zeichnen (display())

2.1 Shader

3. Zusammenfassung

Page 15: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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();

}

Page 16: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Shadow Mapping – createShadowMap()...

}

Page 17: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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 ...

Page 18: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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 );

}

Page 19: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Shadow Mapping – createShadowMap()...

}

Page 20: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Shadow Mapping – createShadowMap()...

}

Page 21: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Shadow Mapping – createShadowMap()...

}

Page 22: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Shadow Mapping – createShadowMap()...

}

Page 23: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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);

}

Page 24: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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();...

}

Page 25: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Inhalt

1. Inititialisieren (init..())

2. Zeichnen (display())

2.1 Shader

3. Zusammenfassung

Page 26: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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();...

}

Page 27: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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();

}

Page 28: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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();...

}

Page 29: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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;

}

Page 30: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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;

Page 31: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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(); ...

Page 32: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Shadow Mapping – resetTextureMatrix()void resetTextureMatrix(){

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

// change matrix stackglMatrixMode(GL_MODELVIEW);

}

Page 33: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Inhalt

1. Inititialisieren (init..())

2. Zeichnen (display())

2.1 Shader

3. Zusammenfassung

Page 34: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

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

Page 35: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Zusammenfassung 1. 2.

3. 4.

5. 6.

2. and 3.

4. and 5.

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

Page 36: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Ergebnis

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

Page 37: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Fragen...

Page 38: Shadow Mapping mit GLSL - Uni Koblenz-Landaucg/ss09/cg3/uebungen/...Programmierübung im Rahmen der Vorlesung „Computergrafik 2" Idee: 1. Kamera in Lichtquelle setzen 2. Z-Buffer

Ende