slang-shaders/motion-interpolation/shaders/motion_interpolation/motion_interpolation_pass3.slang

69 lines
1.9 KiB
Plaintext

#version 450
// Video Motion Interpolation
// based on Drudgerist's shadertoy:
// https://www.shadertoy.com/view/MtVfRz
// which is, in turn, based on bodhid's V+
// https://github.com/bodhid/Vplus
// This pass uses the motion vectors to make an in-between frame
layout(push_constant) uniform Push
{
vec4 SourceSize;
vec4 OriginalSize;
vec4 OutputSize;
uint FrameCount;
float MOTION_SCALE_FACTOR;
float MOTION_MIX_FACTOR;
} params;
#pragma parameter MOTION_SCALE_FACTOR "Motion Interp Factor" 300.0 100.0 1000.0 50.0
#pragma parameter MOTION_MIX_FACTOR "Motion Blur Factor" 0.5 0.0 1.0 0.01
layout(std140, set = 0, binding = 0) uniform UBO
{
mat4 MVP;
} global;
#pragma stage vertex
layout(location = 0) in vec4 Position;
layout(location = 1) in vec2 TexCoord;
layout(location = 0) out vec2 vTexCoord;
void main()
{
gl_Position = global.MVP * Position;
vTexCoord = TexCoord;
}
#pragma stage fragment
layout(location = 0) in vec2 vTexCoord;
layout(location = 0) out vec4 FragColor;
layout(set = 0, binding = 2) uniform sampler2D Source;
layout(set = 0, binding = 3) uniform sampler2D OriginalHistory1;
layout(set = 0, binding = 4) uniform sampler2D Pass0;
layout(set = 0, binding = 5) uniform sampler2D Original;
// uncomment the next line to see the motion vectors for debugging purposes
//#define OUTPUT_MOTION_VECTOR
#define iChannel3 Source
#define iChannel2 Pass0
#define iChannel1 Original
#define iChannel0 OriginalHistory1
void main()
{
vec2 uv = vTexCoord.xy;
vec4 col = texture(iChannel3, uv);
#ifdef OUTPUT_MOTION_VECTOR
FragColor = (col * 0.5) + 0.5;
return;
#endif
float testShift = params.MOTION_MIX_FACTOR;//iMouse.x / iResolution.x;
vec2 FinalUvShift = texture(iChannel2, uv).rg / params.MOTION_SCALE_FACTOR;
vec4 previousFrame = texture(iChannel0, uv - (FinalUvShift * 0.5));
vec4 nextFrame = texture(iChannel1, uv - (FinalUvShift * (0.5)));
FragColor = mix(previousFrame, nextFrame, testShift);
}