www.jpct.net
jPCT - a 3d engine for Java => Support => Topic started by: Jamison on August 22, 2006, 07:50:18 pm
-
Hello all,
I'm trying to render in OpenGL Hardware mode, however, the following is thrown as soon as buffer.clear() is called.
java.lang.NullPointerException
at org.lwjgl.opengl.GL11.glClearColor(GL11.java:562)
at com.threed.jpct.GLRenderer.execute(Unknown Source)
at com.threed.jpct.FrameBuffer.clearHardware(Unknown Source)
at com.threed.jpct.FrameBuffer.clear(Unknown Source)
at com.threed.jpct.FrameBuffer.clear(Unknown Source)
at Hardware3D.Render(Hardware3D.java:35)
at Hardware3D.run(Hardware3D.java:27)
at java.lang.Thread.run(Thread.java:536)
Here is my code:
import java.awt.*;
import com.threed.jpct.*;
public class Hardware3D implements Runnable {
int fps = 60;
int gameW = 640;
int gameH = 480;
World world;
Camera camera;
FrameBuffer buffer;
public Hardware3D() {
buffer = new FrameBuffer(gameW, gameH, buffer.SAMPLINGMODE_NORMAL);
buffer.disableRenderer(IRenderer.RENDERER_SOFTWARE);
buffer.enableRenderer(IRenderer.RENDERER_OPENGL, IRenderer.MODE_OPENGL);
world = new World();
camera = world.getCamera();
(new Thread(this)).start();
}
public void run() {
while(true) {
try {
Render();
GameLoop();
Thread.currentThread().sleep(1000/fps);
} catch(InterruptedException e){}
}
}
public void Render() {
buffer.clear();
world.renderScene(buffer);
world.draw(buffer);
buffer.update();
buffer.displayGLOnly();
}
public void GameLoop() {
}
public static void main(String args[]) {
new Hardware3D();
}
}
I could not find any tutorial or any kind of information on how to render in OpenGL Hardware mode, so I looked through the documentation. I'm assuming I did something wrong here. I'd appreciate any help you can give me.
-
try to initialize te hardware renderer inside the run method!
Egon said its an lwjgl feature nothing to be with jpct.
-
Don't enable the renderer in another thread than the one you are doing the actual rendering in. LWJGL doesn't support this.
Edit: Got owned by Melssj5...one minute too late... :D
-
Thank you guys for the reply. After I found your Paradroidz source and scanned it for about 2 hours, I figured out that my Thread was causing the problem (like you both said), but now I have another... nothing is being rendered onto the screen. Here's my new and updated code:
import java.awt.*;
import java.awt.event.*;
import com.threed.jpct.*;
import com.threed.jpct.util.*;
public class Hardware3D {
int fps = 60;
int gameW = 640;
int gameH = 480;
boolean running = true;
World world;
Camera camera;
FrameBuffer buffer;
KeyMapper keyMapper;
TextureManager texMan;
Object3D object;
public Hardware3D() {
texMan = TextureManager.getInstance();
Config.glWindowName = "Hardware 3D";
Config.glSetDesiredVideoMode(32, 16, 60, false);
buffer = new FrameBuffer(gameW, gameH, buffer.SAMPLINGMODE_NORMAL);
buffer.enableRenderer(IRenderer.RENDERER_OPENGL);
buffer.disableRenderer(IRenderer.RENDERER_SOFTWARE);
world = new World();
camera = world.getCamera();
texMan.addTexture("block", new Texture("Block.png"));
object = Loader.load3DS("Block.3ds", 1f)[0];
object.setTexture("block");
world.addObject(object);
world.buildAllObjects();
camera.setPosition(new SimpleVector(0, 0, -10));
keyMapper = new KeyMapper();
Render();
}
public void ExitNow() {
System.exit(-1);
}
public void Render() {
while(running) {
buffer.clear();
world.renderScene(buffer);
world.draw(buffer);
buffer.update();
buffer.displayGLOnly();
Controls();
GameLoop();
try {
Thread.currentThread().sleep(1000/fps);
} catch(InterruptedException e){}
}
ExitNow();
}
public void Controls() {
int k = keyMapper.poll().getKeyCode();
if (k == KeyEvent.VK_ESCAPE) running = false;
}
public void GameLoop() {
}
public static void main(String args[]) {
new Hardware3D();
}
}
Now what am I doing wrong?
Sorry if it seems like I'm an idiot with jPCT, but it's quite hard without any tutorials. :(
-
WEll, 2 things.
1.- Are you sure you are far enough to see the object.
2.- There are no lights there, so you cant see in the dark.
-
1. Yes, the view is far enough back (since it renders at that same distance in software mode, and the model's size is 2m).
2. I didn't think lights were required. In software mode it renders without lights, or is OpenGL differant?
-
I guess Egon should answer that. try to put the lights and see by yourself.
-
Okay, I added a white light (10, 10, 10) at position 0, 0, -3, and also tried it at 0, 0, -10. Still nothing... I'm stumped. :cry:
EDIT: Apparently the light colors needed to be higher values than software mode, because I changed the light color to 100, 100, 100 and it works now!!!
-
well 10,10,10 is not white, is almost black, anyway you should see something, let me check the code.
-
can you post the complete code now using the lights.?
-
well 10,10,10 is not white, is almost black, anyway you should see something, let me check the code.
Well, whenever I was rendering in software mode, 10, 10, 10 was perfect (sometimes even too bright).
Here's the code:
import java.awt.*;
import java.awt.event.*;
import com.threed.jpct.*;
import com.threed.jpct.util.*;
public class Hardware3D {
int fps = 60;
int gameW = 640;
int gameH = 480;
boolean running = true;
World world;
Camera camera;
FrameBuffer buffer;
KeyMapper keyMapper;
TextureManager texMan;
Object3D object;
public Hardware3D() {
texMan = TextureManager.getInstance();
Config.glWindowName = "Hardware 3D";
Config.glSetDesiredVideoMode(32, 16, 60, false);
buffer = new FrameBuffer(gameW, gameH, buffer.SAMPLINGMODE_NORMAL);
buffer.enableRenderer(IRenderer.RENDERER_OPENGL);
buffer.disableRenderer(IRenderer.RENDERER_SOFTWARE);
world = new World();
camera = world.getCamera();
world.addLight(new SimpleVector(0, 0, -10), new Color(100, 100, 100));
texMan.addTexture("block", new Texture("Block.png"));
object = Loader.load3DS("Block.3ds", 1f)[0];
object.setTexture("block");
world.addObject(object);
world.buildAllObjects();
camera.setPosition(new SimpleVector(0, 0, -5));
keyMapper = new KeyMapper();
Render();
}
public void ExitNow() {
System.exit(-1);
}
public void Render() {
while(running) {
buffer.clear();
world.renderScene(buffer);
world.draw(buffer);
buffer.update();
buffer.displayGLOnly();
Controls();
GameLoop();
try {
Thread.currentThread().sleep(1000/fps);
} catch(InterruptedException e){}
}
ExitNow();
}
public void Controls() {
int k = keyMapper.poll().getKeyCode();
if (k == KeyEvent.VK_ESCAPE) running = false;
}
public void GameLoop() {
}
public static void main(String args[]) {
new Hardware3D();
}
}
(I moved the camera forward by 5 meters just because the model was too far back - it made no rendering differance except -5m is closer.)
EDIT:
Note that I was playing around with the lights and remember Config.setAmbientLight() and it looks better with ambient light color 200, 200, 200.
-
well, all I can suggest and say now just by viewing the code is:
1) Did jpct allowed you to load a png pic as a texture?
2) remove the desired video mode
3) set the running=true inside the constructor
4) add some console messages to see if the loop is being executed, to see what if happening!
5) use the the enableRenderer form that has 2 parameters
you should see it now, but try this to see what is happening, I have not used jpct in many time, just came here ocassionally to help.