1

Is there an easy way to add shadows in opengl-es 1.x? Or only in 2.0?

genpfault
  • 51,148
  • 11
  • 85
  • 139
lacas
  • 13,928
  • 30
  • 109
  • 183

2 Answers2

0

Projective texture mapped shadows like they were done with OpenGL-1.2 without shaders are possible. Look for older shadow mapping tutorials, written between 1999 and 2002.

datenwolf
  • 159,371
  • 13
  • 185
  • 298
  • You wouldn't happen to have a link or two lying around? – Jonas Byström Jun 14 '13 at 20:33
  • @JonasByström: http://www.paulsprojects.net/opengl/rtotex/rtotex.html and http://www.paulsprojects.net/tutorials/smt/smt.html were found with a little bit of Google :) – datenwolf Jun 15 '13 at 01:08
  • Thanks, I was however able to get stencil shadows working on iOS/GLES1 (despite [this](http://stackoverflow.com/a/13270713/87973) contradictory answer). – Jonas Byström Jun 17 '13 at 12:34
  • @JonasByström: Note that OpenGL-ES-1 says depth and stencil buffers may be unavailable. So on implementations that have them, they're also available in OpenGL-ES-1, but it's not required to be. – datenwolf Jun 17 '13 at 12:40
0

For projecting a shadow on a plane there's a simple way (not very efficient, but simple).

This function is not mine, I forget were I found it. What it does is create a matrix projection that maps everything you draw onto a single plane.

static inline void glShadowProjection(float * l, float * e, float * n)
{
float d, c;
float mat[16];

// These are c and d (corresponding to the tutorial)

d = n[0]*l[0] + n[1]*l[1] + n[2]*l[2];
c = e[0]*n[0] + e[1]*n[1] + e[2]*n[2] - d;

// Create the matrix. OpenGL uses column by column
// ordering

mat[0]  = l[0]*n[0]+c; 
mat[4]  = n[1]*l[0]; 
mat[8]  = n[2]*l[0]; 
mat[12] = -l[0]*c-l[0]*d;

mat[1]  = n[0]*l[1];        
mat[5]  = l[1]*n[1]+c;
mat[9]  = n[2]*l[1]; 
mat[13] = -l[1]*c-l[1]*d;

mat[2]  = n[0]*l[2];        
mat[6]  = n[1]*l[2]; 
mat[10] = l[2]*n[2]+c; 
mat[14] = -l[2]*c-l[2]*d;

mat[3]  = n[0];        
mat[7]  = n[1]; 
mat[11] = n[2]; 
mat[15] = -d;

// Finally multiply the matrices together *plonk*
glMultMatrixf(mat);
}

Use it like this:

Draw your object.

           glDrawArrays(GL_TRIANGLES, 0, machadoNumVerts);            // Machado

Suply it with a light source position, a plane where the shadow will be projected and the normal.

    float lightPosition[] = {383.0, 461.0, 500.0, 0.0} 
    float n[] = { 0.0,  0.0, -1.0 }; // Normal vector for the plane
    float e[] = { 0.0, 0.0, beltOrigin+1 }; // Point of the plane
    glShadowProjection(lightPosition,e,n); 

Ok, shadow matrix is applied.

Change the drawing color to something that fits.

    glColor4f(0.3, 0.3, 0.3, 0.9);

Draw your object again.

           glDrawArrays(GL_TRIANGLES, 0, machadoNumVerts);            // Machado

That is why this is not efficient, the more complex the object the more useless triangles you waste just for a shadow.

Also remember that every manipulation you made to the unshadowed object needs to be done after the shadow matrix is applied.

For more complex stuff the subject is a bit broad, and depends a lot on your scene and complexity.

led42
  • 781
  • 5
  • 10