Setup of the shadows looks fine to me. Can i have a look at the actual render code (i.e. the call to render(...) and that stuff)?
Edit: When not rendering the shadows, make sure that you a) are doing the correct world.render(...); world.draw(...); sequence yourself and b) ensure that you haven't setup the ShadowHelper even if you are not using it later. It adds an additional texture layer for the shadows, which will cause the rendering to look strange if not used later.
Here's a test program in native OpenGL mode. It renders a simple scene with shadows (can be disabled in the code by setting a flag). It prints its frame rate to the console. Please give it a try and report the results.
import java.awt.*;
import com.threed.jpct.*;
import com.threed.jpct.util.*;
public class SimpleShadows {
private FrameBuffer fb = null;
private World world = null;
private Object3D plane = null;
private Object3D cube = null;
private Object3D sphere = null;
private Projector projector=null;
private ShadowHelper sh = null;
private Light sun=null;
private boolean shadows=true;
public SimpleShadows() {
Logger.setOnError(Logger.ON_ERROR_THROW_EXCEPTION);
Config.glColorDepth = 24;
Config.glFullscreen = false;
Config.farPlane = 1000;
Config.glShadowZBias = 0.8f;
Config.glTrilinear=true;
Config.glUseFBO=true;
}
private void initStuff() throws Exception {
fb = new FrameBuffer(800, 600, FrameBuffer.SAMPLINGMODE_NORMAL);
world = new World();
fb.enableRenderer(IRenderer.RENDERER_OPENGL, IRenderer.MODE_OPENGL);
fb.disableRenderer(IRenderer.RENDERER_SOFTWARE);
Config.lightMul=1;
plane = Primitives.getPlane(20, 30);
plane.rotateX((float) Math.PI / 2f);
cube=Primitives.getCube(15);
cube.setAdditionalColor(Color.RED);
cube.translate(0, -30, -10);
sphere=Primitives.getSphere(12);
sphere.translate(0, 0, -50);
sphere.setAdditionalColor(new Color(0,0,50));
world.addObject(sphere);
world.addObject(plane);
world.addObject(cube);
plane.compile(false);
cube.compile(false);
sphere.compile(false);
projector = new Projector();
if (shadows) {
sh = new ShadowHelper(world, fb, projector, 1024);
sh.setCullingMode(false);
sh.addCaster(cube);
sh.addCaster(sphere);
sh.addReceiver(plane);
sh.addReceiver(cube);
sh.addReceiver(sphere);
sh.setAmbientLight(new Color(30,30,30));
sh.setFiltering(true);
}
world.setAmbientLight(90,90,90);
world.buildAllObjects();
sun=new Light(world);
sun.setIntensity(250, 250, 250);
}
private void doIt() throws Exception {
Camera cam = world.getCamera();
cam.moveCamera(Camera.CAMERA_MOVEOUT, 150);
cam.moveCamera(Camera.CAMERA_MOVEUP, 100);
cam.lookAt(plane.getTransformedCenter());
projector.setFOV(0.5f);
projector.setYFOV(0.5f);
SimpleVector pos=cube.getTransformedCenter();
projector.setPosition(pos);
projector.moveCamera(Camera.CAMERA_MOVEUP, 200);
projector.lookAt(pos);
SimpleVector offset=new SimpleVector(1,0,-1).normalize();
projector.moveCamera(offset, 215);
int fps=0;
long time=System.currentTimeMillis();
while (!org.lwjgl.opengl.Display.isCloseRequested()) {
projector.lookAt(cube.getTransformedCenter());
offset.rotateY(0.007f);
projector.setPosition(pos);
projector.moveCamera(new SimpleVector(0,-1,0), 200);
projector.moveCamera(offset, 215);
SimpleVector sp=projector.getPosition();
sp.y+=150;
sun.setPosition(sp);
sun.setAttenuation(-1);
if (shadows) {
sh.updateShadowMap();
fb.clear();
sh.drawScene();
} else {
fb.clear();
world.renderScene(fb);
world.draw(fb);
}
fb.update();
fb.displayGLOnly();
if (System.currentTimeMillis() - time >= 1000) {
System.out.println(fps);
fps = 0;
time = System.currentTimeMillis();
}
fps++;
}
fb.disableRenderer(IRenderer.RENDERER_OPENGL);
fb.dispose();
System.exit(0);
}
public static void main(String[] args) throws Exception {
SimpleShadows cd = new SimpleShadows();
cd.initStuff();
cd.doIt();
}
}
Edit: And here's the same thing for the AWTGLRenderer:
import java.awt.*;
import javax.swing.JFrame;
import com.threed.jpct.*;
import com.threed.jpct.util.*;
public class SimpleShadowsAWT implements IPaintListener {
private FrameBuffer fb = null;
private World world = null;
private Object3D plane = null;
private Object3D cube = null;
private Object3D sphere = null;
private Projector projector=null;
private ShadowHelper sh = null;
private Light sun=null;
private JFrame frame;
private Canvas canvas;
private int fps=0;
private long time=System.currentTimeMillis();
private boolean shadows=true;
public SimpleShadowsAWT() {
Logger.setOnError(Logger.ON_ERROR_THROW_EXCEPTION);
Config.glColorDepth = 24;
Config.glFullscreen = false;
Config.farPlane = 1000;
Config.glShadowZBias = 0.8f;
Config.glTrilinear=true;
Config.glUseFBO=true;
}
private void initStuff() throws Exception {
fb = new FrameBuffer(800, 600, FrameBuffer.SAMPLINGMODE_NORMAL);
world = new World();
canvas=fb.enableGLCanvasRenderer();
fb.disableRenderer(IRenderer.RENDERER_SOFTWARE);
frame=new JFrame("Hello world");
frame.setSize(800, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.add(canvas);
fb.setPaintListener(this);
Config.lightMul=1;
plane = Primitives.getPlane(20, 30);
plane.rotateX((float) Math.PI / 2f);
cube=Primitives.getCube(15);
cube.setAdditionalColor(Color.RED);
cube.translate(0, -30, -10);
sphere=Primitives.getSphere(12);
sphere.translate(0, 0, -50);
sphere.setAdditionalColor(new Color(0,0,50));
world.addObject(sphere);
world.addObject(plane);
world.addObject(cube);
plane.compile(false);
cube.compile(false);
sphere.compile(false);
projector = new Projector();
if (shadows) {
sh = new ShadowHelper(world, fb, projector, 1024);
sh.setCullingMode(false);
sh.addCaster(cube);
sh.addCaster(sphere);
sh.addReceiver(plane);
sh.addReceiver(cube);
sh.addReceiver(sphere);
sh.setAmbientLight(new Color(30,30,30));
sh.setFiltering(true);
}
world.setAmbientLight(90,90,90);
world.buildAllObjects();
sun=new Light(world);
sun.setIntensity(250, 250, 250);
}
private void doIt() throws Exception {
Camera cam = world.getCamera();
cam.moveCamera(Camera.CAMERA_MOVEOUT, 150);
cam.moveCamera(Camera.CAMERA_MOVEUP, 100);
cam.lookAt(plane.getTransformedCenter());
projector.setFOV(0.5f);
projector.setYFOV(0.5f);
SimpleVector pos=cube.getTransformedCenter();
projector.setPosition(pos);
projector.moveCamera(Camera.CAMERA_MOVEUP, 200);
projector.lookAt(pos);
SimpleVector offset=new SimpleVector(1,0,-1).normalize();
projector.moveCamera(offset, 215);
while (frame.isShowing()) {
projector.lookAt(cube.getTransformedCenter());
offset.rotateY(0.007f);
projector.setPosition(pos);
projector.moveCamera(new SimpleVector(0,-1,0), 200);
projector.moveCamera(offset, 215);
SimpleVector sp=projector.getPosition();
sp.y+=150;
sun.setPosition(sp);
sun.setAttenuation(-1);
if (shadows) {
sh.updateShadowMap();
fb.clear();
sh.drawScene();
} else {
fb.clear();
world.renderScene(fb);
world.draw(fb);
}
fb.update();
fb.displayGLOnly();
canvas.repaint();
Thread.yield();
}
fb.dispose();
System.exit(0);
}
public static void main(String[] args) throws Exception {
SimpleShadowsAWT cd = new SimpleShadowsAWT();
cd.initStuff();
cd.doIt();
}
public void finishedPainting() {
if (System.currentTimeMillis() - time >= 1000) {
System.out.println(fps);
fps = 0;
time = System.currentTimeMillis();
}
fps++;
}
public void startPainting() {
}
}