Ein einfaches Beispiel, in 15 Minuten zusammengehackt...also bitte keine Wunder erwarten. Es rendert einen drehenden Würfel und blitted oben drüber ein BufferedImage, in das in jedem Frame ein Haufen zufälliger blauer Quadrate gemalt werden. Vielleicht hilft das.
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import org.lwjgl.opengl.Display;
import com.threed.jpct.FrameBuffer;
import com.threed.jpct.IRenderer;
import com.threed.jpct.ITextureEffect;
import com.threed.jpct.Object3D;
import com.threed.jpct.Primitives;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.Texture;
import com.threed.jpct.World;
import com.threed.jpct.util.Light;
public class BlitExample {
public static void main(String[] args) {
new BlitExample().doIt();
}
private void doIt() {
FrameBuffer buffer = new FrameBuffer(800, 600, FrameBuffer.SAMPLINGMODE_HARDWARE_ONLY);
buffer.disableRenderer(IRenderer.RENDERER_SOFTWARE);
buffer.enableRenderer(IRenderer.RENDERER_OPENGL);
World world = new World();
Object3D cube = Primitives.getCube(10);
cube.translate(0, 0, 50);
Light light = new Light(world);
light.setIntensity(255, 0, 0);
light.setPosition(new SimpleVector(-100, 0, 0));
world.addObject(cube);
world.buildAllObjects();
BufferedImage image = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB);
final int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
Texture blitTexture = new Texture(512, 512);
blitTexture.setEffect(new ITextureEffect() {
@Override
public void init(Texture tex) {
// TODO Auto-generated method stub
}
@Override
public void apply(int[] dest, int[] source) {
System.arraycopy(pixels, 0, dest, 0, pixels.length);
}
@Override
public boolean containsAlpha() {
return true;
}
});
long time = System.currentTimeMillis();
int fps = 0;
while (!Display.isCloseRequested()) {
cube.rotateY(0.01f);
buffer.clear();
world.renderScene(buffer);
world.draw(buffer);
updateAndBlit(buffer, image, blitTexture);
buffer.update();
buffer.displayGLOnly();
fps++;
if (System.currentTimeMillis() - time >= 1000) {
System.out.println(fps + "fps");
fps = 0;
time = System.currentTimeMillis();
}
}
}
private void updateAndBlit(FrameBuffer buffer, BufferedImage image, Texture blitTexture) {
Graphics2D g = image.createGraphics();
g.setBackground(new Color(0, 0, 0, 0));
g.clearRect(0, 0, image.getWidth(), image.getHeight());
g.setColor(new Color(0, 0, 255, 255));
for (int i = 0; i < 5; i++) {
int x = (int) (Math.random() * image.getWidth());
int y = (int) (Math.random() * image.getHeight());
g.fillRect(x, y, 100, 100);
}
g.dispose();
blitTexture.applyEffect();
buffer.blit(blitTexture, 0, 0, 0, 0, 512, 512, buffer.getOutputWidth(), buffer.getOutputHeight(), 15, false, null);
}
}
ABER: Um etwa wie im Bild oben zu rendern, würde ich das niemals so machen. Da sollte die GUI tatsächlich komplett per Blitting erstellt werden. Wenn Sie nur zeitweise zu sehen ist und/oder sich nicht so oft ändert, mag die Lösung mit einem BufferedImage akzeptabel sein.