Soft particles now has only one shader and one technique to work with any glsl version

fix-456
Nehon 8 years ago
parent 4fbe5ec84d
commit 390d35180b
  1. 39
      jme3-core/src/main/resources/Common/MatDefs/Misc/Particle.j3md
  2. 15
      jme3-core/src/main/resources/Common/MatDefs/Misc/SoftParticle.frag
  3. 51
      jme3-core/src/main/resources/Common/MatDefs/Misc/SoftParticle15.frag
  4. 4
      jme3-effects/src/main/java/com/jme3/post/filters/TranslucentBucketFilter.java
  5. 4
      jme3-examples/src/main/java/jme3test/effect/TestSoftParticles.java

@ -59,10 +59,7 @@ MaterialDef Point Sprite {
} }
Defines { Defines {
COLOR_MAP : ColorMap COLOR_MAP : Texture
DISCARD_ALPHA : AlphaDiscardThreshold
NUM_BONES : NumberOfBones
INSTANCING : UseInstancing
} }
ForcedRenderState { ForcedRenderState {
@ -77,30 +74,8 @@ MaterialDef Point Sprite {
Technique SoftParticles{ Technique SoftParticles{
VertexShader GLSL100 : Common/MatDefs/Misc/SoftParticle.vert VertexShader GLSL100 GLSL150 : Common/MatDefs/Misc/SoftParticle.vert
FragmentShader GLSL100 : Common/MatDefs/Misc/SoftParticle.frag FragmentShader GLSL120 GLSL150 : Common/MatDefs/Misc/SoftParticle.frag
WorldParameters {
WorldViewProjectionMatrix
WorldViewMatrix
WorldMatrix
CameraPosition
}
RenderState {
Blend AlphaAdditive
DepthWrite Off
}
Defines {
USE_TEXTURE : Texture
}
}
Technique SoftParticles15{
VertexShader GLSL150 : Common/MatDefs/Misc/SoftParticle.vert
FragmentShader GLSL150 : Common/MatDefs/Misc/SoftParticle15.frag
WorldParameters { WorldParameters {
WorldViewProjectionMatrix WorldViewProjectionMatrix
@ -122,14 +97,6 @@ MaterialDef Point Sprite {
} }
} }
Technique {
RenderState {
Blend AlphaAdditive
// DepthWrite Off
// AlphaTestFalloff 0.01
}
}
Technique Glow { Technique Glow {
VertexShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.vert VertexShader GLSL100 GLSL150: Common/MatDefs/Misc/Unshaded.vert

@ -1,4 +1,7 @@
uniform sampler2D m_DepthTexture; #import "Common/ShaderLib/GLSLCompat.glsllib"
#import "Common/ShaderLib/MultiSample.glsllib"
uniform DEPTHTEXTURE m_DepthTexture;
uniform float m_Softness; // Power used in the contrast function uniform float m_Softness; // Power used in the contrast function
varying vec2 vPos; // Position of the pixel varying vec2 vPos; // Position of the pixel
varying vec2 projPos;// z and w valus in projection space varying vec2 projPos;// z and w valus in projection space
@ -36,15 +39,15 @@ void main(){
#endif #endif
float depthv = texture2D(m_DepthTexture, vPos).x*2.0-1.0; // Scene depth float depthv = fetchTextureSample(m_DepthTexture, vPos, 0).x * 2.0 - 1.0; // Scene depth
depthv*=projPos.y; depthv *= projPos.y;
float particleDepth = projPos.x; float particleDepth = projPos.x;
float zdiff =depthv-particleDepth; float zdiff = depthv - particleDepth;
if(zdiff<=0.0){ if(zdiff <= 0.0){
discard; discard;
} }
// Computes alpha based on the particles distance to the rest of the scene // Computes alpha based on the particles distance to the rest of the scene
c.a = c.a * stdDiff(zdiff);// Contrast(zdiff); c.a = c.a * stdDiff(zdiff);// Contrast(zdiff);
gl_FragColor =c; gl_FragColor = c;
} }

@ -1,51 +0,0 @@
#import "Common/ShaderLib/MultiSample.glsllib"
uniform DEPTHTEXTURE m_DepthTexture;
uniform float m_Softness; // Power used in the contrast function
in vec2 vPos; // Position of the pixel
in vec2 projPos;// z and w valus in projection space
#ifdef USE_TEXTURE
uniform sampler2D m_Texture;
in vec4 texCoord;
#endif
in vec4 color;
out vec4 outColor;
float Contrast(in float d){
float val = clamp( 2.0*( (d > 0.5) ? 1.0-d : d ), 0.0, 1.0);
float a = 0.5 * pow(val, m_Softness);
return (d > 0.5) ? 1.0 - a : a;
}
float stdDiff(in float d){
return clamp((d)*m_Softness,0.0,1.0);
}
void main(){
if (color.a <= 0.01)
discard;
outColor = vec4(1.0,1.0,1.0,1.0);//color;
#ifdef USE_TEXTURE
#ifdef POINT_SPRITE
vec2 uv = mix(texCoord.xy, texCoord.zw, gl_PointCoord.xy);
#else
vec2 uv = texCoord.xy;
#endif
outColor = getColor(m_Texture, uv) * color;
#endif
float depthv = getDepth(m_DepthTexture, vPos).x*2.0-1.0; // Scene depth
depthv*=projPos.y;
float particleDepth = projPos.x;
float zdiff =depthv-particleDepth;
if(zdiff<=0.0){
discard;
}
// Computes alpha based on the particles distance to the rest of the scene
outColor.a = outColor.a * stdDiff(zdiff);// Contrast(zdiff);
}

@ -165,11 +165,9 @@ public final class TranslucentBucketFilter extends Filter {
if (enabled) { if (enabled) {
enabledSoftParticles = enabled; enabledSoftParticles = enabled;
emitter.getMaterial().selectTechnique("SoftParticles", renderManager);
if( processor.getNumSamples()>1){ if( processor.getNumSamples()>1){
emitter.getMaterial().selectTechnique("SoftParticles15", renderManager);
emitter.getMaterial().setInt("NumSamplesDepth", processor.getNumSamples()); emitter.getMaterial().setInt("NumSamplesDepth", processor.getNumSamples());
}else{
emitter.getMaterial().selectTechnique("SoftParticles", renderManager);
} }
emitter.getMaterial().setTexture("DepthTexture", processor.getDepthTexture()); emitter.getMaterial().setTexture("DepthTexture", processor.getDepthTexture());
emitter.setQueueBucket(RenderQueue.Bucket.Translucent); emitter.setQueueBucket(RenderQueue.Bucket.Translucent);

@ -95,6 +95,10 @@ public class TestSoftParticles extends SimpleApplication {
fpp = new FilterPostProcessor(assetManager); fpp = new FilterPostProcessor(assetManager);
tbf = new TranslucentBucketFilter(true); tbf = new TranslucentBucketFilter(true);
fpp.addFilter(tbf); fpp.addFilter(tbf);
int samples = context.getSettings().getSamples();
if (samples > 0) {
fpp.setNumSamples(samples);
}
viewPort.addProcessor(fpp); viewPort.addProcessor(fpp);
particleNode = new Node("particleNode"); particleNode = new Node("particleNode");

Loading…
Cancel
Save