http://wiki.vrmedia.it/index.php?title=Shadow_Mapping
anyone want to implement that into a RenderPass ? doesn't look too hard. I tried my heart out, but my knowledge of opengl just is great enough.
heres what i coded up that doesn't work at all:
import com.jme.image.Texture;
import com.jme.light.PointLight;
import com.jme.math.Matrix4f;
import com.jme.math.Vector3f;
import com.jme.renderer.AbstractCamera;
import com.jme.renderer.Camera;
import com.jme.renderer.ColorRGBA;
import com.jme.renderer.Renderer;
import com.jme.renderer.TextureRenderer;
import com.jme.renderer.pass.Pass;
import com.jme.scene.Node;
import com.jme.scene.SceneElement;
import com.jme.scene.Spatial;
import com.jme.scene.batch.TriangleBatch;
import com.jme.scene.shape.Quad;
import com.jme.scene.state.AlphaState;
import com.jme.scene.state.GLSLShaderObjectsState;
import com.jme.scene.state.LightState;
import com.jme.scene.state.RenderState;
import com.jme.scene.state.TextureState;
import com.jme.system.DisplaySystem;
public class ShadowMapPass extends Pass {
private static final long serialVersionUID = 1L;
private TextureRenderer tRenderer;
private Texture mainTexture;
private Quad fullScreenQuad;
private TriangleBatch fullScreenQuadBatch;
Camera cam;
PointLight light;
Vector3f lightDirection;
private GLSLShaderObjectsState shadowShader;
private boolean supported = true;
private boolean useCurrentScene = false;
Matrix4f lightProjection = new Matrix4f();
Matrix4f lightModelView = new Matrix4f();
public void cleanup() {
super.cleanUp();
if (tRenderer != null)
tRenderer.cleanup();
}
public boolean isSupported() {
return supported;
}
public ShadowMapPass(Camera cam, PointLight light, Vector3f direction) {
DisplaySystem display = DisplaySystem.getDisplaySystem();
//Create texture renderers and rendertextures(alternating between two not to overwrite pbuffers)
tRenderer = display.createTextureRenderer(
display.getWidth(),
display.getHeight(),
TextureRenderer.RENDER_TEXTURE_2D);
tRenderer.setBackgroundColor(new ColorRGBA(0.0f, 0.0f, 0.0f, 1.0f));
tRenderer.setCamera(cam);
this.cam=cam;
this.light=light;
lightDirection = direction;
mainTexture = new Texture();
mainTexture.setWrap(Texture.WM_CLAMP_S_CLAMP_T);
mainTexture.setFilter(Texture.FM_LINEAR);
tRenderer.setupTexture(mainTexture);
shadowShader = display.getRenderer().createGLSLShaderObjectsState();
if(!shadowShader.isSupported()) {
supported = false;
} else {
shadowShader.load(ShadowMapPass.class.getClassLoader().getResource("shadow.vert"),
ShadowMapPass.class.getClassLoader().getResource("shadow.frag"));
shadowShader.setEnabled(true);
}
//Create fullscreen quad
fullScreenQuad = new Quad("FullScreenQuad", display.getWidth()/4, display.getHeight()/4);
fullScreenQuadBatch = fullScreenQuad.getBatch(0);
fullScreenQuad.getLocalRotation().set(0, 0, 0, 1);
fullScreenQuad.getLocalTranslation().set(display.getWidth() / 2, display.getHeight() / 2, 0);
fullScreenQuad.getLocalScale().set(1, 1, 1);
fullScreenQuad.setRenderQueueMode(Renderer.QUEUE_ORTHO);
fullScreenQuad.setCullMode(SceneElement.CULL_NEVER);
fullScreenQuad.setTextureCombineMode(TextureState.REPLACE);
fullScreenQuad.setLightCombineMode(LightState.OFF);
TextureState ts = display.getRenderer().createTextureState();
ts.setEnabled(true);
fullScreenQuadBatch.setRenderState(ts);
AlphaState as = display.getRenderer().createAlphaState();
as.setBlendEnabled(true);
as.setSrcFunction(AlphaState.SB_ONE);
as.setDstFunction(AlphaState.DB_ONE);
as.setEnabled(true);
fullScreenQuadBatch.setRenderState(as);
fullScreenQuad.updateRenderState();
fullScreenQuad.updateGeometricState(0.0f, true);
}
/**
* Helper class to get all spatials rendered in one TextureRenderer.render() call.
*/
public void doRender(Renderer r) {
Vector3f camOrigPos =cam.getLocation();
Vector3f camOrigDir =cam.getDirection();
cam.setLocation(light.getLocation());
cam.setDirection(lightDirection);
lightProjection.set( ((AbstractCamera) cam).getProjectionMatrix() );
lightModelView.set( ((AbstractCamera) cam).getModelViewMatrix() );
cam.setLocation(camOrigPos);
cam.setDirection(camOrigDir);
TextureState ts = (TextureState) fullScreenQuadBatch.states[RenderState.RS_TEXTURE];
//Extract intensity
shadowShader.clearUniforms();
shadowShader.setUniform("shadowMap", 0);
ts.setTexture(mainTexture, 0);
fullScreenQuadBatch.states[RenderState.RS_GLSL_SHADER_OBJECTS] = shadowShader;
tRenderer.render(fullScreenQuad,mainTexture);
}
}