mirror of
https://github.com/italicsjenga/slang-shaders.git
synced 2024-11-23 00:01:31 +11:00
69 lines
1.9 KiB
Plaintext
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);
|
|
} |