Search in sources :

Example 1 with RenderBuffer

use of com.jme3.texture.FrameBuffer.RenderBuffer in project jmonkeyengine by jMonkeyEngine.

the class GLRenderer method setFrameBuffer.

public void setFrameBuffer(FrameBuffer fb) {
    if (fb == null && mainFbOverride != null) {
        fb = mainFbOverride;
    }
    if (context.boundFB == fb) {
        if (fb == null || !fb.isUpdateNeeded()) {
            return;
        }
    }
    if (!caps.contains(Caps.FrameBuffer)) {
        throw new RendererException("Framebuffer objects are not supported" + " by the video hardware");
    }
    // generate mipmaps for last FB if needed
    if (context.boundFB != null) {
        for (int i = 0; i < context.boundFB.getNumColorBuffers(); i++) {
            RenderBuffer rb = context.boundFB.getColorBuffer(i);
            Texture tex = rb.getTexture();
            if (tex != null && tex.getMinFilter().usesMipMapLevels()) {
                setTexture(0, rb.getTexture());
                int textureType = convertTextureType(tex.getType(), tex.getImage().getMultiSamples(), rb.getFace());
                glfbo.glGenerateMipmapEXT(textureType);
            }
        }
    }
    if (fb == null) {
        bindFrameBuffer(null);
        setReadDrawBuffers(null);
    } else {
        if (fb.isUpdateNeeded()) {
            updateFrameBuffer(fb);
        } else {
            bindFrameBuffer(fb);
            setReadDrawBuffers(fb);
        }
        // update viewport to reflect framebuffer's resolution
        setViewPort(0, 0, fb.getWidth(), fb.getHeight());
        assert fb.getId() > 0;
        assert context.boundFBO == fb.getId();
        context.boundFB = fb;
    }
}
Also used : Texture(com.jme3.texture.Texture) RenderBuffer(com.jme3.texture.FrameBuffer.RenderBuffer)

Example 2 with RenderBuffer

use of com.jme3.texture.FrameBuffer.RenderBuffer in project jmonkeyengine by jMonkeyEngine.

the class GLRenderer method readFrameBufferWithGLFormat.

private void readFrameBufferWithGLFormat(FrameBuffer fb, ByteBuffer byteBuf, int glFormat, int dataType) {
    if (fb != null) {
        RenderBuffer rb = fb.getColorBuffer();
        if (rb == null) {
            throw new IllegalArgumentException("Specified framebuffer" + " does not have a colorbuffer");
        }
        setFrameBuffer(fb);
        if (gl2 != null) {
            if (context.boundReadBuf != rb.getSlot()) {
                gl2.glReadBuffer(GLFbo.GL_COLOR_ATTACHMENT0_EXT + rb.getSlot());
                context.boundReadBuf = rb.getSlot();
            }
        }
    } else {
        setFrameBuffer(null);
    }
    gl.glReadPixels(vpX, vpY, vpW, vpH, glFormat, dataType, byteBuf);
}
Also used : RenderBuffer(com.jme3.texture.FrameBuffer.RenderBuffer)

Example 3 with RenderBuffer

use of com.jme3.texture.FrameBuffer.RenderBuffer in project jmonkeyengine by jMonkeyEngine.

the class GLRenderer method updateRenderTexture.

public void updateRenderTexture(FrameBuffer fb, RenderBuffer rb) {
    Texture tex = rb.getTexture();
    Image image = tex.getImage();
    if (image.isUpdateNeeded()) {
        // Check NPOT requirements
        checkNonPowerOfTwo(tex);
        updateTexImageData(image, tex.getType(), 0, false);
        // NOTE: For depth textures, sets nearest/no-mips mode
        // Required to fix "framebuffer unsupported"
        // for old NVIDIA drivers!
        setupTextureParams(0, tex);
    }
    if (rb.getLayer() < 0) {
        glfbo.glFramebufferTexture2DEXT(GLFbo.GL_FRAMEBUFFER_EXT, convertAttachmentSlot(rb.getSlot()), convertTextureType(tex.getType(), image.getMultiSamples(), rb.getFace()), image.getId(), 0);
    } else {
        gl3.glFramebufferTextureLayer(GLFbo.GL_FRAMEBUFFER_EXT, convertAttachmentSlot(rb.getSlot()), image.getId(), 0, rb.getLayer());
    }
}
Also used : Image(com.jme3.texture.Image) Texture(com.jme3.texture.Texture)

Example 4 with RenderBuffer

use of com.jme3.texture.FrameBuffer.RenderBuffer in project jmonkeyengine by jMonkeyEngine.

the class GLRenderer method setReadDrawBuffers.

public void setReadDrawBuffers(FrameBuffer fb) {
    if (gl2 == null) {
        return;
    }
    final int NONE = -2;
    final int INITIAL = -1;
    final int MRT_OFF = 100;
    if (fb == null) {
        // Set Read/Draw buffers to initial value.
        if (context.boundDrawBuf != INITIAL) {
            gl2.glDrawBuffer(context.initialDrawBuf);
            context.boundDrawBuf = INITIAL;
        }
        if (context.boundReadBuf != INITIAL) {
            gl2.glReadBuffer(context.initialReadBuf);
            context.boundReadBuf = INITIAL;
        }
    } else {
        if (fb.getNumColorBuffers() == 0) {
            // no color buffer attached.
            if (context.boundDrawBuf != NONE) {
                gl2.glDrawBuffer(GL.GL_NONE);
                context.boundDrawBuf = NONE;
            }
            if (context.boundReadBuf != NONE) {
                gl2.glReadBuffer(GL.GL_NONE);
                context.boundReadBuf = NONE;
            }
        } else {
            if (fb.getNumColorBuffers() > limits.get(Limits.FrameBufferAttachments)) {
                throw new RendererException("Framebuffer has more color " + "attachments than are supported" + " by the video hardware!");
            }
            if (fb.isMultiTarget()) {
                if (!caps.contains(Caps.FrameBufferMRT)) {
                    throw new RendererException("Multiple render targets " + " are not supported by the video hardware");
                }
                if (fb.getNumColorBuffers() > limits.get(Limits.FrameBufferMrtAttachments)) {
                    throw new RendererException("Framebuffer has more" + " multi targets than are supported" + " by the video hardware!");
                }
                intBuf16.clear();
                for (int i = 0; i < fb.getNumColorBuffers(); i++) {
                    intBuf16.put(GLFbo.GL_COLOR_ATTACHMENT0_EXT + i);
                }
                intBuf16.flip();
                glext.glDrawBuffers(intBuf16);
                context.boundDrawBuf = MRT_OFF + fb.getNumColorBuffers();
            } else {
                RenderBuffer rb = fb.getColorBuffer(fb.getTargetIndex());
                // select this draw buffer
                if (context.boundDrawBuf != rb.getSlot()) {
                    gl2.glDrawBuffer(GLFbo.GL_COLOR_ATTACHMENT0_EXT + rb.getSlot());
                    context.boundDrawBuf = rb.getSlot();
                }
            }
        }
    }
}
Also used : RenderBuffer(com.jme3.texture.FrameBuffer.RenderBuffer)

Example 5 with RenderBuffer

use of com.jme3.texture.FrameBuffer.RenderBuffer in project jmonkeyengine by jMonkeyEngine.

the class TestRenderToMemory method setupOffscreenView.

public void setupOffscreenView() {
    offCamera = new Camera(width, height);
    // create a pre-view. a view that is rendered before the main view
    offView = renderManager.createPreView("Offscreen View", offCamera);
    offView.setBackgroundColor(ColorRGBA.DarkGray);
    offView.setClearFlags(true, true, true);
    // this will let us know when the scene has been rendered to the 
    // frame buffer
    offView.addProcessor(this);
    // create offscreen framebuffer
    offBuffer = new FrameBuffer(width, height, 1);
    //setup framebuffer's cam
    offCamera.setFrustumPerspective(45f, 1f, 1f, 1000f);
    offCamera.setLocation(new Vector3f(0f, 0f, -5f));
    offCamera.lookAt(new Vector3f(0f, 0f, 0f), Vector3f.UNIT_Y);
    //setup framebuffer's texture
    //        offTex = new Texture2D(width, height, Format.RGBA8);
    //setup framebuffer to use renderbuffer
    // this is faster for gpu -> cpu copies
    offBuffer.setDepthBuffer(Format.Depth);
    offBuffer.setColorBuffer(Format.RGBA8);
    //        offBuffer.setColorTexture(offTex);
    //set viewport to render to offscreen framebuffer
    offView.setOutputFrameBuffer(offBuffer);
    // setup framebuffer's scene
    Box boxMesh = new Box(1, 1, 1);
    Material material = assetManager.loadMaterial("Interface/Logo/Logo.j3m");
    offBox = new Geometry("box", boxMesh);
    offBox.setMaterial(material);
    // attach the scene to the viewport to be rendered
    offView.attachScene(offBox);
}
Also used : Geometry(com.jme3.scene.Geometry) Vector3f(com.jme3.math.Vector3f) Box(com.jme3.scene.shape.Box) Material(com.jme3.material.Material) Camera(com.jme3.renderer.Camera) FrameBuffer(com.jme3.texture.FrameBuffer)

Aggregations

RenderBuffer (com.jme3.texture.FrameBuffer.RenderBuffer)3 Texture (com.jme3.texture.Texture)2 Material (com.jme3.material.Material)1 Vector3f (com.jme3.math.Vector3f)1 Camera (com.jme3.renderer.Camera)1 Geometry (com.jme3.scene.Geometry)1 Box (com.jme3.scene.shape.Box)1 FrameBuffer (com.jme3.texture.FrameBuffer)1 Image (com.jme3.texture.Image)1