Hello,
I’m rendering a scene to an offscreen buffer and saving that to an image file, but having problems in setting anti-aliasing up for it.
This is the code I use to create the buffer and viewport:
[java]
renderBuffer = new FrameBuffer(width, height, samples);
renderBuffer.setDepthBuffer(Image.Format.Depth);
renderBuffer.setColorBuffer(Image.Format.RGBA8);
renderViewPort = new ViewPort(“SpriteRenderer”, renderCam);
renderViewPort.setClearFlags(true, true, true);
// renderViewPort.setBackgroundColor(new ColorRGBA(0, 0, 0, 0));
renderViewPort.setBackgroundColor(ColorRGBA.Green); // for testing only, end result should have transparent background
renderViewPort.setOutputFrameBuffer(renderBuffer);
[/java]
I’ve tried several values for the samples parameter in the FrameBuffer, but as soon as I set it higher than 1 I end up with an empty buffer (=> not even the scene’s back color, transparency only) in my scene processor’s postFrame method. It renders fine with samples set to 1 or 0, but obviously without the smooth edges.
I’ve also tried the FXAAFilter (with default parameters) instead, but that one doesn’t like transparent background color, which is essential for what I’m trying to do (render a 2d sprite from a 3d model). And even with that one I didn’t have any smoother edges on the rendered sprite.
For completeness sake, here’s the code I use to save the image (taken and adapted from ScreenshotAppState):
FileOutputStream out = new FileOutputStream(new File(“test.png”));
ByteBuffer outBuffer = BufferUtils.createByteBuffer(width * height * 4);
[java]
@Override
public void postFrame(FrameBuffer frameBuffer) {
try {
FileOutputStream out = new FileOutputStream(new File(“test.png”));
ByteBuffer outBuffer = BufferUtils.createByteBuffer(width * height * 4);
int viewX = (int) (renderCam.getViewPortLeft() * renderCam.getWidth());
int viewY = (int) (renderCam.getViewPortBottom() * renderCam.getHeight());
int viewWidth = (int) ((renderCam.getViewPortRight() - renderCam.getViewPortLeft()) * renderCam.getWidth());
int viewHeight = (int) ((renderCam.getViewPortTop() - renderCam.getViewPortBottom()) * renderCam.getHeight());
renderer.setViewPort(0, 0, width, height);
renderer.readFrameBuffer(frameBuffer, outBuffer);
renderer.setViewPort(viewX, viewY, viewWidth, viewHeight);
JmeSystem.writeImageFile(out, "png", outBuffer, width, height);
out.close();
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
[/java]
Anyone knows what I’m doing wrong?