From ec4708e2c1fa262ab5e82565b10aa21ad85db9d5 Mon Sep 17 00:00:00 2001 From: Jan Ivenz Date: Thu, 21 Jan 2016 14:13:18 +0100 Subject: [PATCH 1/4] Texture arrays are now allowed as color buffer render targets. --- .../java/com/jme3/texture/FrameBuffer.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java index bc21fd82bb..7237c1e0a3 100644 --- a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java +++ b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java @@ -324,6 +324,19 @@ public void setColorTexture(Texture2D tex){ addColorTexture(tex); } + /** + * Set the color texture array to use for this framebuffer. + * This automatically clears all existing textures added previously + * with {@link FrameBuffer#addColorTexture } and adds this texture as the + * only target. + * + * @param tex The color texture array to set. + */ + public void setColorTexture(TextureArray tex){ + clearColorTargets(); + addColorTexture(tex); + } + /** * Set the color texture to use for this framebuffer. * This automatically clears all existing textures added previously @@ -369,6 +382,30 @@ public void addColorTexture(Texture2D tex) { colorBufs.add(colorBuf); } + /** + * Add a color texture array to use for this framebuffer. + * If MRT is enabled, then each subsequently added texture can be + * rendered to through a shader that writes to the array gl_FragData. + * If MRT is not enabled, then the index set with {@link FrameBuffer#setTargetIndex(int) } + * is rendered to by the shader. + * + * @param tex The texture array to add. + */ + public void addColorTexture(TextureArray tex) { + if (id != -1) + throw new UnsupportedOperationException("FrameBuffer already initialized."); + + Image img = tex.getImage(); + checkSetTexture(tex, false); + + RenderBuffer colorBuf = new RenderBuffer(); + colorBuf.slot = colorBufs.size(); + colorBuf.tex = tex; + colorBuf.format = img.getFormat(); + + colorBufs.add(colorBuf); + } + /** * Add a color texture to use for this framebuffer. * If MRT is enabled, then each subsequently added texture can be From 5224da84b94f87ef30b9ae3192acc48b8b0efe8c Mon Sep 17 00:00:00 2001 From: Jan Ivenz Date: Fri, 29 Jan 2016 13:04:31 +0100 Subject: [PATCH 2/4] Rendering depth to texture arrays. --- .../java/com/jme3/renderer/opengl/GL3.java | 1 + .../jme3/renderer/opengl/GLDebugDesktop.java | 6 +++++ .../com/jme3/renderer/opengl/GLRenderer.java | 18 +++++++++---- .../main/java/com/jme3/shader/VarType.java | 2 +- .../java/com/jme3/texture/FrameBuffer.java | 25 ++++++++++++++++--- .../java/com/jme3/renderer/jogl/JoglGL.java | 5 ++++ .../java/com/jme3/renderer/lwjgl/LwjglGL.java | 5 ++++ .../java/com/jme3/renderer/lwjgl/LwjglGL.java | 5 ++++ 8 files changed, 58 insertions(+), 9 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java index 2a7c38bb9c..1fbad5c2dd 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GL3.java @@ -58,6 +58,7 @@ public interface GL3 extends GL2 { public void glBindFragDataLocation(int param1, int param2, String param3); /// GL3+ public void glBindVertexArray(int param1); /// GL3+ public void glDeleteVertexArrays(IntBuffer arrays); /// GL3+ + public void glFramebufferTextureLayer(int param1, int param2, int param3, int param4, int param5); /// GL3+ public void glGenVertexArrays(IntBuffer param1); /// GL3+ public String glGetString(int param1, int param2); /// GL3+ } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java index a0511f6ada..fd18cc7ffd 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLDebugDesktop.java @@ -94,4 +94,10 @@ public void glPatchParameter(int count) { gl4.glPatchParameter(count); checkError(); } + + @Override + public void glFramebufferTextureLayer(int param1, int param2, int param3, int param4, int param5) { + gl3.glFramebufferTextureLayer(param1, param2, param3, param4, param5); + checkError(); + } } diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index 50e603d2f1..3b7fe5271b 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -1438,11 +1438,19 @@ public void updateRenderTexture(FrameBuffer fb, RenderBuffer rb) { setupTextureParams(0, tex); } - glfbo.glFramebufferTexture2DEXT(GLFbo.GL_FRAMEBUFFER_EXT, - convertAttachmentSlot(rb.getSlot()), - convertTextureType(tex.getType(), image.getMultiSamples(), rb.getFace()), - image.getId(), - 0); + 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()); + } } public void updateFrameBufferAttachment(FrameBuffer fb, RenderBuffer rb) { diff --git a/jme3-core/src/main/java/com/jme3/shader/VarType.java b/jme3-core/src/main/java/com/jme3/shader/VarType.java index b494daf57e..7300294d42 100644 --- a/jme3-core/src/main/java/com/jme3/shader/VarType.java +++ b/jme3-core/src/main/java/com/jme3/shader/VarType.java @@ -55,7 +55,7 @@ public enum VarType { TextureBuffer(false,true,"sampler1D|sampler1DShadow"), Texture2D(false,true,"sampler2D|sampler2DShadow"), Texture3D(false,true,"sampler3D"), - TextureArray(false,true,"sampler2DArray"), + TextureArray(false,true,"sampler2DArray|sampler2DArrayShadow"), TextureCubeMap(false,true,"samplerCube"), Int("int"); diff --git a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java index 7237c1e0a3..a3f825d267 100644 --- a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java +++ b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java @@ -97,6 +97,7 @@ public class RenderBuffer { int id = -1; int slot = SLOT_UNDEF; int face = -1; + int layer = -1; /** * @return The image format of the render buffer. @@ -160,6 +161,10 @@ public String toString(){ return "BufferTarget[format=" + format + "]"; } } + + public int getLayer() { + return this.layer; + } } /** @@ -332,9 +337,9 @@ public void setColorTexture(Texture2D tex){ * * @param tex The color texture array to set. */ - public void setColorTexture(TextureArray tex){ + public void setColorTexture(TextureArray tex, int layer){ clearColorTargets(); - addColorTexture(tex); + addColorTexture(tex, layer); } /** @@ -391,7 +396,7 @@ public void addColorTexture(Texture2D tex) { * * @param tex The texture array to add. */ - public void addColorTexture(TextureArray tex) { + public void addColorTexture(TextureArray tex, int layer) { if (id != -1) throw new UnsupportedOperationException("FrameBuffer already initialized."); @@ -402,6 +407,7 @@ public void addColorTexture(TextureArray tex) { colorBuf.slot = colorBufs.size(); colorBuf.tex = tex; colorBuf.format = img.getFormat(); + colorBuf.layer = layer; colorBufs.add(colorBuf); } @@ -449,7 +455,20 @@ public void setDepthTexture(Texture2D tex){ depthBuf.tex = tex; depthBuf.format = img.getFormat(); } + public void setDepthTexture(TextureArray tex, int layer){ + if (id != -1) + throw new UnsupportedOperationException("FrameBuffer already initialized."); + Image img = tex.getImage(); + checkSetTexture(tex, true); + + depthBuf = new RenderBuffer(); + depthBuf.slot = img.getFormat().isDepthStencilFormat() ? SLOT_DEPTH_STENCIL : SLOT_DEPTH; + depthBuf.tex = tex; + depthBuf.format = img.getFormat(); + depthBuf.layer = layer; + } + /** * @return The number of color buffers attached to this texture. */ diff --git a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java index 3da2ed49e5..2ca2fb2666 100644 --- a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java +++ b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/JoglGL.java @@ -600,4 +600,9 @@ public void glDeleteVertexArrays(IntBuffer arrays) { checkLimit(arrays); GLContext.getCurrentGL().getGL2ES3().glDeleteVertexArrays(arrays.limit(), arrays); } + + @Override + public void glFramebufferTextureLayer(int param1, int param2, int param3, int param4, int param5) { + GLContext.getCurrentGL().getGL3().glFramebufferTextureLayer(param1, param2, param3, param4, param5); + } } diff --git a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java index 2b7df131a9..6f640042fb 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java +++ b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java @@ -457,4 +457,9 @@ public void glDeleteVertexArrays(IntBuffer arrays) { checkLimit(arrays); ARBVertexArrayObject.glDeleteVertexArrays(arrays); } + + @Override + public void glFramebufferTextureLayer(int param1, int param2, int param3, int param4, int param5) { + GL30.glFramebufferTextureLayer(param1, param2, param3, param4, param5); + } } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java index 187b232f2b..25de6b1484 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/renderer/lwjgl/LwjglGL.java @@ -486,4 +486,9 @@ public void glDeleteVertexArrays(IntBuffer arrays) { checkLimit(arrays); ARBVertexArrayObject.glDeleteVertexArrays(arrays); } + + @Override + public void glFramebufferTextureLayer(int param1, int param2, int param3, int param4, int param5) { + GL30.glFramebufferTextureLayer(param1, param2, param3, param4, param5); + } } From 4096b16a431926d3c44d3aef0eeb1d032ac4ba2f Mon Sep 17 00:00:00 2001 From: Jan Ivenz Date: Wed, 16 Mar 2016 11:25:43 +0100 Subject: [PATCH 3/4] Fixed shader generation bug for array variables. --- .../main/java/com/jme3/shader/Glsl100ShaderGenerator.java | 7 ++++++- .../jme3/material/plugins/ShaderNodeLoaderDelegate.java | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java b/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java index a7a53b915e..ffe96d0f0b 100644 --- a/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java +++ b/jme3-core/src/main/java/com/jme3/shader/Glsl100ShaderGenerator.java @@ -258,7 +258,7 @@ protected void generateNodeMainSection(StringBuilder source, ShaderNode shaderNo } for (ShaderNodeVariable var : shaderNode.getDefinition().getOutputs()) { - ShaderNodeVariable v = new ShaderNodeVariable(var.getType(), shaderNode.getName(), var.getName()); + ShaderNodeVariable v = new ShaderNodeVariable(var.getType(), shaderNode.getName(), var.getName(), var.getMultiplicity()); if (!declaredInputs.contains(shaderNode.getName() + "_" + var.getName())) { if (!isVarying(info, v)) { declareVariable(source, v); @@ -397,6 +397,11 @@ protected void map(VariableMapping mapping, StringBuilder source) { source.append(mapping.getLeftVariable().getNameSpace()); source.append("_"); source.append(mapping.getLeftVariable().getName()); + if (mapping.getLeftVariable().getMultiplicity() != null){ + source.append("["); + source.append(mapping.getLeftVariable().getMultiplicity()); + source.append("]"); + } //left swizzle, the variable can't be declared and assigned on the same line. if (mapping.getLeftSwizzling().length() > 0) { diff --git a/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java b/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java index 4437293f3e..7cc902f95c 100644 --- a/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java +++ b/jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java @@ -752,6 +752,7 @@ public VariableMapping readInputMapping(Statement statement1) throws IOException } right.setNameSpace(node.getName()); right.setType(var.getType()); + right.setMultiplicity(var.getMultiplicity()); mapping.setRightVariable(right); storeVaryings(node, mapping.getRightVariable()); From 5610cb658127e208c038e23d49dd0f0ddd4a0ddf Mon Sep 17 00:00:00 2001 From: Jan Ivenz Date: Wed, 16 Mar 2016 18:53:03 +0100 Subject: [PATCH 4/4] For LightFilter to be implementable frustumCheckNeeded and intersectsFrustum need to be public. --- jme3-core/src/main/java/com/jme3/light/Light.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/light/Light.java b/jme3-core/src/main/java/com/jme3/light/Light.java index 759eea14e0..6d370fcbd9 100644 --- a/jme3-core/src/main/java/com/jme3/light/Light.java +++ b/jme3-core/src/main/java/com/jme3/light/Light.java @@ -117,8 +117,8 @@ public int getId(){ */ protected String name; - boolean frustumCheckNeeded = true; - boolean intersectsFrustum = false; + public boolean frustumCheckNeeded = true; + public boolean intersectsFrustum = false; protected Light() { }