This is the minimum test case. The PreHdr shader should just output a red color, however, black arrives at the ToneMap shader.
The Filter:
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
import com.jme3.post.Filter;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.texture.*;
import java.util.ArrayList;
public class HDRFilterTestCase extends Filter {
private Material preHdrMaterial;
private Pass preHdrPass;
public HDRFilterTestCase() {
super("HDRFilter");
}
@Override
protected boolean isRequiresDepthTexture() {
return false;
}
@Override
protected void initFilter(AssetManager manager, RenderManager renderManager,
ViewPort vp, int w, int h) {
material = new Material(manager, "MatDefs/Hdr/ToneMap.j3md");
preHdrMaterial=new Material(manager, "MatDefs/Hdr/PreHdr.j3md");
preHdrPass=new Pass()
{
@Override
public boolean requiresSceneAsTexture() {return true;}
};
preHdrPass.init(renderManager.getRenderer(), 1, 1, Image.Format.RGBA8, Image.Format.Depth, 1, preHdrMaterial);
postRenderPasses=new ArrayList<Pass>();
postRenderPasses.add(preHdrPass);
material.setTexture("Luminance", preHdrPass.getRenderedTexture());
}
@Override
protected Material getMaterial() {
return material;
}
}
PreHdr.j3md
MaterialDef PreHdr {
MaterialParameters {
Int NumSamples
Int NumSamplesDepth
Texture2D Texture
}
Technique {
VertexShader GLSL150: Common/MatDefs/Post/Post15.vert
FragmentShader GLSL150: MatDefs/Hdr/PreHdr.frag
WorldParameters {
}
Defines {
TEXTURE
RESOLVE_MS : NumSamples
RESOLVE_DEPTH_MS : NumSamplesDepth
}
}
Technique {
VertexShader GLSL100: Common/MatDefs/Post/Post.vert
FragmentShader GLSL100: MatDefs/Hdr/PreHdr.frag
WorldParameters {
}
Defines {
TEXTURE
}
}
}
PreHdr.frag
#import "Common/ShaderLib/MultiSample.glsllib"
uniform COLORTEXTURE m_Texture;
#if __VERSION__ >= 150
in vec2 texCoord;
out vec4 outFragColor;
#else
varying vec2 texCoord;
#endif
void main()
{
//vec4 texVal=texture2D(m_Texture, texCoord);
vec4 texVal=vec4(1.0, 0.0, 0.0, 1.0);
#if __VERSION__ >= 150
outFragColor = texVal;
#else
gl_FragColor = texVal;
#endif
}
ToneMap.j3md
MaterialDef Tone Mapper {
MaterialParameters {
Int NumSamples
Int NumSamplesDepth
Texture2D Texture
Texture2D Luminance
}
Technique {
VertexShader GLSL150: Common/MatDefs/Post/Post15.vert
FragmentShader GLSL150: MatDefs/Hdr/ToneMap.frag
WorldParameters {
WorldViewProjectionMatrix
}
Defines {
TEXTURE
RESOLVE_MS : NumSamples
RESOLVE_DEPTH_MS : NumSamplesDepth
}
}
Technique {
VertexShader GLSL100: Common/MatDefs/Post/Post.vert
FragmentShader GLSL100: MatDefs/Hdr/ToneMap.frag
WorldParameters {
WorldViewProjectionMatrix
}
Defines {
TEXTURE
}
}
}
ToneMap.frag
#import "Common/ShaderLib/MultiSample.glsllib"
uniform COLORTEXTURE m_Texture;
uniform sampler2D m_Luminance;
#if __VERSION__ >= 150
in vec2 texCoord;
out vec4 outFragColor;
#else
varying vec2 texCoord;
#endif
void main() {
vec4 texVal = getColor(m_Texture, texCoord);
vec4 lumVal = texture2D(m_Luminance, texCoord);
// Should be red, but is black
vec3 toneMapped = lumVal.rgb;
#if __VERSION__ >= 150
outFragColor = vec4(toneMapped, texVal.a);
#else
gl_FragColor = vec4(toneMapped, texVal.a);
#endif
}