I’m woking on a filter to produce a circular fade in/out effect, similar to this.
I have all the code almost finished but the problem is that I don’t know how to cencer the circle on a object’s position.
I’m passing the target position (object global position) to the vert shader. Inside vert shader code, I multiply worldViewProjectionMatrix by targetPosition. Is that ok? How should I center the circle using a geometry position?
CircularFading.vert
[java]
uniform mat4 g_WorldViewProjectionMatrix;
uniform mat4 g_ViewProjectionMatrix;
uniform vec3 m_Target;
attribute vec3 inPosition;
attribute vec2 inTexCoord;
varying vec2 texCoord;
varying vec2 position;
void main() {
vec2 pos = (g_WorldViewProjectionMatrix * vec4(inPosition, 1.0)).xy;
gl_Position = vec4(pos, 0.0, 1.0);
texCoord = inTexCoord;
position = (g_ViewProjectionMatrix * vec4(m_Target, 1.0)).xy;
}
[/java]
CircularFading.frag
[java]
uniform float g_Aspect;
uniform vec2 g_Resolution;
uniform sampler2D m_Texture;
varying vec2 texCoord;
varying vec2 position;
void main() {
vec3 color = texture2D(m_Texture, texCoord).rgb;
float radius = 0.3;
vec2 circleCenter = position;
float posX = clamp(circleCenter.x, 0.0, g_Resolution.x) * (g_Aspect);
float posY = clamp(circleCenter.y, 0.0, g_Resolution.y);
float d = distance(vec2(posX, posY), vec2(texCoord.x * (g_Aspect), texCoord.y));
//float vignetting = clamp((0.5 - d) / (0.5 - 0.1), 0.0, 1.0);
float vignetting = d > radius ? 0.0: 1.0;
color.rgb *= vignetting;
gl_FragColor.rgb = color;
gl_FragColor.a = 1.0;
}
[/java]
CircleFadingFilter.java
[java]
public class CircleFadingFilter extends Filter {
/** Geometry position use as Circle center point */
private Vector3f target;
/**
* Constructor.
*/
public CircleFadingFilter(final Vector3f target) {
super("OldFilmFilter");
this.target = target;
}
@Override
protected Material getMaterial() {
return this.material;
}
@Override
protected void initFilter(final AssetManager manager, final RenderManager renderManager, final ViewPort vp,
final int w, final int h) {
this.material = new Material(manager, "ShaderBlow/MatDefs/Filters/FadeCircle/FadeCircle.j3md");
this.material.setVector3("Target", this.target);
}
}
[/java]
[java]
MaterialDef ColorScale {
MaterialParameters {
Int NumSamples
Texture2D Texture
Vector3 Target
}
Technique {
VertexShader GLSL100: ShaderBlow/Filters/FadeCircle/CircleFading.vert
FragmentShader GLSL100: ShaderBlow/Filters/FadeCircle/FadeCircle.frag
WorldParameters {
WorldViewProjectionMatrix
ViewProjectionMatrix
Aspect
}
}
}
[/java]