I created a simple post processing “Pixelation” filter effect. Here are the results of a pixelized town.zip demo (with the Sky Dome shader as well):
One could combine a Posterization filter with this to get an 8-bit/16-bit retro look actually ;p
Let me know if there’s anyway to improve upon this.
Um. So ya. Here:
Pixelation.frag:
[code]uniform sampler2D m_Texture; // 0 - final scene image
varying vec2 texCoord;
uniform float m_ResX;
uniform float m_ResY;
void main()
{
vec2 uv = texCoord.xy;
vec2 coord = vec2(m_ResX * floor(uv.x / m_ResX),
m_ResY * floor(uv.y / m_ResY));
vec3 tc = texture2D(m_Texture, coord).rgb;
gl_FragColor = vec4(tc, 1.0);
}[/code]
Pixelation15.frag
[code]#import “Common/ShaderLib/MultiSample.glsllib”
in vec2 texCoord;
out vec4 fragColor;
uniform COLORTEXTURE m_Texture;
uniform float m_ResX;
uniform float m_ResY;
void main()
{
vec2 uv = texCoord.xy;
vec2 coord = vec2(m_ResX * floor(uv.x / m_ResX),
m_ResY * floor(uv.y / m_ResY));
vec3 tc = texture2D(m_Texture, coord).rgb;
gl_FragColor = vec4(tc, 1.0);
}[/code]
Pixelation.j3md
[code]MaterialDef Pixelation {
MaterialParameters {
Int NumSamples
Texture2D Texture
Float ResX
Float ResY
}
Technique {
VertexShader GLSL150: Common/MatDefs/Post/Post15.vert
FragmentShader GLSL150: Shaders/Pixelation/Pixelation15.frag
WorldParameters {
WorldViewProjectionMatrix
}
}
Technique {
VertexShader GLSL110: Common/MatDefs/Post/Post.vert
FragmentShader GLSL110: Shaders/Pixelation/Pixelation.frag
WorldParameters {
WorldViewProjectionMatrix
}
}
}[/code]
PixelationFilter.java
[code]/**
- Pixelation post processing filter.
- @author Cord Rehn - jordansg57@gmail.com
*/
public class PixelationFilter extends Filter {
private float pixelWidth, pixelHeight;
private float screenWidth, screenHeight;
private float resX, resY;
public PixelationFilter() {
super("PixelationFilter");
}
/**
* @see com.jme3.post.Filter#initFilter(com.jme3.asset.AssetManager, com.jme3.renderer.RenderManager,
* com.jme3.renderer.ViewPort, int, int)
*/
@Override
protected void initFilter(final AssetManager manager, final RenderManager renderManager, final ViewPort vp, final int w, final int h) {
material = new Material(manager, "Shaders/Pixelation/Pixelation.j3md");
screenWidth = w;
screenHeight = h;
setPixelWidth(10); // default- 10x10 pixelation
setPixelHeight(10);
material.setFloat("ResX", resX);
material.setFloat("ResY", resY);
}
public float getPixelWidth() { return pixelWidth; }
public void setPixelWidth(float x) {
pixelWidth = x;
resX = pixelWidth / screenWidth;
}
public float getPixelHeight() { return pixelHeight; }
public void setPixelHeight(float y) {
pixelHeight = y;
resY = pixelHeight / screenHeight;
}
/**
* @see com.jme3.post.Filter#getMaterial()
*/
@Override
protected Material getMaterial() {
return material;
}
}[/code]