109 lines
2.6 KiB
GLSL
109 lines
2.6 KiB
GLSL
/*
|
|
BSL Shaders v8 Series by Capt Tatsu
|
|
https://bitslablab.com
|
|
*/
|
|
|
|
//Settings//
|
|
#include "/lib/settings.glsl"
|
|
|
|
//Fragment Shader///////////////////////////////////////////////////////////////////////////////////
|
|
#ifdef FSH
|
|
|
|
//Varyings//
|
|
varying vec2 texCoord;
|
|
|
|
//Uniforms//
|
|
uniform float viewWidth, viewHeight, aspectRatio;
|
|
|
|
uniform vec3 cameraPosition, previousCameraPosition;
|
|
|
|
uniform mat4 gbufferPreviousProjection, gbufferProjectionInverse;
|
|
uniform mat4 gbufferModelView, gbufferPreviousModelView, gbufferModelViewInverse;
|
|
|
|
uniform sampler2D colortex0;
|
|
uniform sampler2D depthtex1;
|
|
|
|
//Common Functions//
|
|
vec3 MotionBlur(vec3 color, float z, float dither) {
|
|
|
|
float hand = float(z < 0.56);
|
|
|
|
if (hand < 0.5) {
|
|
float mbwg = 0.0;
|
|
vec2 doublePixel = 2.0 / vec2(viewWidth, viewHeight);
|
|
vec3 mblur = vec3(0.0);
|
|
|
|
vec4 currentPosition = vec4(texCoord, z, 1.0) * 2.0 - 1.0;
|
|
|
|
vec4 viewPos = gbufferProjectionInverse * currentPosition;
|
|
viewPos = gbufferModelViewInverse * viewPos;
|
|
viewPos /= viewPos.w;
|
|
|
|
vec3 cameraOffset = cameraPosition - previousCameraPosition;
|
|
|
|
vec4 previousPosition = viewPos + vec4(cameraOffset, 0.0);
|
|
previousPosition = gbufferPreviousModelView * previousPosition;
|
|
previousPosition = gbufferPreviousProjection * previousPosition;
|
|
previousPosition /= previousPosition.w;
|
|
|
|
vec2 velocity = (currentPosition - previousPosition).xy;
|
|
velocity = velocity / (1.0 + length(velocity)) * MOTION_BLUR_STRENGTH * 0.02;
|
|
|
|
vec2 coord = texCoord.st - velocity * (1.5 + dither);
|
|
for(int i = 0; i < 5; i++, coord += velocity) {
|
|
vec2 sampleCoord = clamp(coord, doublePixel, 1.0 - doublePixel);
|
|
float mask = float(texture2D(depthtex1, sampleCoord).r > 0.56);
|
|
mblur += texture2DLod(colortex0, sampleCoord, 0.0).rgb * mask;
|
|
mbwg += mask;
|
|
}
|
|
mblur /= max(mbwg, 1.0);
|
|
|
|
return mblur;
|
|
}
|
|
else return color;
|
|
}
|
|
|
|
|
|
//Includes//
|
|
#include "/lib/util/dither.glsl"
|
|
|
|
#ifdef OUTLINE_OUTER
|
|
#include "/lib/util/outlineOffset.glsl"
|
|
#include "/lib/util/outlineDepth.glsl"
|
|
#endif
|
|
|
|
//Program//
|
|
void main() {
|
|
vec3 color = texture2DLod(colortex0, texCoord, 0.0).rgb;
|
|
|
|
#ifdef MOTION_BLUR
|
|
float z = texture2D(depthtex1, texCoord.st).x;
|
|
float dither = Bayer8(gl_FragCoord.xy);
|
|
|
|
#ifdef OUTLINE_OUTER
|
|
DepthOutline(z, depthtex1);
|
|
#endif
|
|
|
|
color = MotionBlur(color, z, dither);
|
|
#endif
|
|
|
|
/*DRAWBUFFERS:0*/
|
|
gl_FragData[0] = vec4(color,1.0);
|
|
}
|
|
|
|
#endif
|
|
|
|
//Vertex Shader/////////////////////////////////////////////////////////////////////////////////////
|
|
#ifdef VSH
|
|
|
|
//Varyings//
|
|
varying vec2 texCoord;
|
|
|
|
//Program//
|
|
void main() {
|
|
texCoord = gl_MultiTexCoord0.xy;
|
|
|
|
gl_Position = ftransform();
|
|
}
|
|
|
|
#endif |