* Better checking for MRT in renderer (first against max color attachments then against draw buffers)
* Now uses only OpenGL2 draw buffers instead of relying on GL_ARB_draw_buffers existing * copyFrameBuffer() was non-functional when used against the main framebuffer because the width/height were set to zero erroneously, now it uses the current viewport parameters. * Added TestRenderToCubemap to demonstrate render to cubemap functionality, it also uses MRT to render to all the cube sides git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9378 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
fba447dc60
commit
cac820803b
@ -0,0 +1,132 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2012 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
|
||||||
|
package jme3test.post; |
||||||
|
|
||||||
|
import com.jme3.app.SimpleApplication; |
||||||
|
import com.jme3.material.Material; |
||||||
|
import com.jme3.math.ColorRGBA; |
||||||
|
import com.jme3.math.FastMath; |
||||||
|
import com.jme3.math.Quaternion; |
||||||
|
import com.jme3.math.Vector3f; |
||||||
|
import com.jme3.renderer.Camera; |
||||||
|
import com.jme3.renderer.ViewPort; |
||||||
|
import com.jme3.scene.Geometry; |
||||||
|
import com.jme3.scene.shape.Box; |
||||||
|
import com.jme3.texture.FrameBuffer; |
||||||
|
import com.jme3.texture.Image.Format; |
||||||
|
import com.jme3.texture.Texture; |
||||||
|
import com.jme3.texture.TextureCubeMap; |
||||||
|
import com.jme3.util.SkyFactory; |
||||||
|
|
||||||
|
/** |
||||||
|
* Renders a rotating box to a cubemap texture, then applies the cubemap |
||||||
|
* texture as a sky. |
||||||
|
*/ |
||||||
|
public class TestRenderToCubemap extends SimpleApplication { |
||||||
|
|
||||||
|
private Geometry offBox; |
||||||
|
private float angle = 0; |
||||||
|
private ViewPort offView; |
||||||
|
|
||||||
|
public static void main(String[] args){ |
||||||
|
TestRenderToCubemap app = new TestRenderToCubemap(); |
||||||
|
app.start(); |
||||||
|
} |
||||||
|
|
||||||
|
public Texture setupOffscreenView(){ |
||||||
|
Camera offCamera = new Camera(512, 512); |
||||||
|
|
||||||
|
offView = renderManager.createPreView("Offscreen View", offCamera); |
||||||
|
offView.setClearFlags(true, true, true); |
||||||
|
offView.setBackgroundColor(ColorRGBA.DarkGray); |
||||||
|
|
||||||
|
// create offscreen framebuffer
|
||||||
|
FrameBuffer offBuffer = new FrameBuffer(512, 512, 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
|
||||||
|
TextureCubeMap offTex = new TextureCubeMap(512, 512, Format.RGBA8); |
||||||
|
offTex.setMinFilter(Texture.MinFilter.Trilinear); |
||||||
|
offTex.setMagFilter(Texture.MagFilter.Bilinear); |
||||||
|
|
||||||
|
//setup framebuffer to use texture
|
||||||
|
offBuffer.setDepthBuffer(Format.Depth); |
||||||
|
offBuffer.setMultiTarget(true); |
||||||
|
offBuffer.addColorTexture(offTex, TextureCubeMap.Face.NegativeX); |
||||||
|
offBuffer.addColorTexture(offTex, TextureCubeMap.Face.PositiveX); |
||||||
|
offBuffer.addColorTexture(offTex, TextureCubeMap.Face.NegativeY); |
||||||
|
offBuffer.addColorTexture(offTex, TextureCubeMap.Face.PositiveY); |
||||||
|
offBuffer.addColorTexture(offTex, TextureCubeMap.Face.NegativeZ); |
||||||
|
offBuffer.addColorTexture(offTex, TextureCubeMap.Face.PositiveZ); |
||||||
|
|
||||||
|
//set viewport to render to offscreen framebuffer
|
||||||
|
offView.setOutputFrameBuffer(offBuffer); |
||||||
|
|
||||||
|
// setup framebuffer's scene
|
||||||
|
Box boxMesh = new Box(Vector3f.ZERO, 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); |
||||||
|
|
||||||
|
return offTex; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void simpleInitApp() { |
||||||
|
cam.setLocation(new Vector3f(3, 3, 3)); |
||||||
|
cam.lookAt(Vector3f.ZERO, Vector3f.UNIT_Y); |
||||||
|
|
||||||
|
Texture offTex = setupOffscreenView(); |
||||||
|
rootNode.attachChild(SkyFactory.createSky(assetManager, offTex, false)); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void simpleUpdate(float tpf){ |
||||||
|
Quaternion q = new Quaternion(); |
||||||
|
|
||||||
|
angle += tpf; |
||||||
|
angle %= FastMath.TWO_PI; |
||||||
|
q.fromAngles(angle, 0, angle); |
||||||
|
|
||||||
|
offBox.setLocalRotation(q); |
||||||
|
offBox.updateLogicalState(tpf); |
||||||
|
offBox.updateGeometricState(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue