Custom motion blur

  • matsilagi
  • Topic Author
More
8 years 2 months ago #1 by matsilagi Custom motion blur was created by matsilagi
Hey!
So, im retouching that shader im porting from Unity, and i need help figuring out what im doing wrong (again :v )

So, the code is exactly the same than the source, but no matter how i try, it always ends up looking like this:



Now, as you can see, the code is not entirely wrong, as the red motion blur infact WORKS, but, it should look like this:


My code is almost 1:1, so i don't see why the results would be wrong, here's both codes for reference: pastebin.com/C9sfLJvt

Im pretty sure its either something on the samplers or the frame copy, but im not sure what exactly.

Please Log in or Create an account to join the conversation.

  • kingeric1992
More
8 years 1 month ago - 8 years 1 month ago #2 by kingeric1992 Replied by kingeric1992 on topic Custom motion blur
try these settings:
#define feedbackAmount 0.5
#define feedbackThresh 0.3
#define feedbackFade 0.8
#define feedbackAmp 5


some note to your code:

line 114: use previous frame
line 126, 127, 128: use previous feed back buffer

pixel shader 3 write to feedbackbuffer

line 141: use current feed back buffer (result of pixel shader 3)

and mine implementation:
#define feedbackAmount  0.5
#define feedbackThresh  0.3
#define feedbackColor   float3(1.0,0.5,0.0)
#define feedbackFade    0.8
#define feedbackAmp     5

texture2D VHS_InputTexA    { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA8; };
texture2D VHS_InputTexB    { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA8; };
texture2D VHS_FeedbackTexA { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA8; };
texture2D VHS_FeedbackTexB { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA8; };

sampler2D VHS_InputA    { Texture = VHS_InputTexA;    };
sampler2D VHS_InputB    { Texture = VHS_InputTexB;    };
sampler2D VHS_FeedbackA { Texture = VHS_FeedbackTexA; };
sampler2D VHS_FeedbackB { Texture = VHS_FeedbackTexB; };


float3 bm_screen(float3 a, float3 b) { return 1.0 - ( 1.0 - a) * ( 1.0 - b); }

void VS_VHS(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 texcoord : TEXCOORD)
{
    texcoord.x = (id == 2) ? 2.0 : 0.0;
    texcoord.y = (id == 1) ? 2.0 : 0.0;
    pos = float4(texcoord * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
}

void PS_VHS_Main(float4 vpos     : SV_Position, out float4 output   : SV_Target0,     
            float2 texcoord : TEXCOORD,    out float4 feedback : SV_Target1 )
{
    float3 color     = tex2D( RFX_backbufferColor, texcoord).rgb;    // curent frame

    //new feedback
    float3 lastframe = tex2D( VHS_InputB, texcoord).rgb;    //last frame without feedback
    float  diff      = dot(abs(lastframe - color), 0.3333); //dfference between frames
    diff             = (diff < feedbackThresh)? 0.0: diff;
    float3 fbn       = color * diff * feedbackAmount;       //feedback new
    // fbn = float3(0.0, 0.0, 0.0);

    //feedback buffer
    float3 fbb = tex2D( VHS_FeedbackB, texcoord).rgb; 
    fbb       += tex2D( VHS_FeedbackB, texcoord + float2(RFX_PixelSize.x, 0.0)).rgb + 
                 tex2D( VHS_FeedbackB, texcoord - float2(RFX_PixelSize.x, 0.0)).rgb;
    fbb       /= 3.0;
    fbb        = bm_screen(fbn, fbb * feedbackFade) * feedbackColor;    //feedback

    //blend
    color    = bm_screen(color, fbb * feedbackAmp);
//    color = color + fbb * feedbackAmp;
    output   = float4( color, 1.0); 
    feedback = float4( fbb,   1.0);
}

void PS_VHS_Lastframe(float4 vpos     : SV_Position, out float4 output   : SV_Target0, 
                      float2 texcoord : TEXCOORD,    out float4 feedback : SV_Target1)
{
    output   = tex2D( VHS_InputA,    texcoord);
    feedback = tex2D( VHS_FeedbackA, texcoord);
}

float4 PS_VHS(float4 vpos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
    return tex2D( VHS_InputB,    texcoord);
}

technique VHS < enabled = true; toggle = VK_F2;>
{
    pass VHS_Main
    {
        VertexShader  = VS_VHS;
        PixelShader   = PS_VHS_Main;
        RenderTarget0 = VHS_InputTexA;
        RenderTarget1 = VHS_FeedbackTexA;
    }
    pass VHS_Lastframe
    {
        VertexShader  = VS_VHS;
        PixelShader   = PS_VHS_Lastframe;   
        RenderTarget0 = VHS_InputTexB;
        RenderTarget1 = VHS_FeedbackTexB;
    }
    pass VHS
    {
        VertexShader  = VS_VHS;
        PixelShader   = PS_VHS;
    }    
}
Last edit: 8 years 1 month ago by kingeric1992.
The following user(s) said Thank You: matsilagi

Please Log in or Create an account to join the conversation.

  • matsilagi
  • Topic Author
More
8 years 1 month ago - 8 years 1 month ago #3 by matsilagi Replied by matsilagi on topic Custom motion blur
Thanks a lot, but its giving a error for me (on OpenGL)
0(53) : error C0000: syntax error, unexpected reserved word at token "output"
0(57) : error C0000: syntax error, unexpected '(' at token "("
0(60) : error C0000: syntax error, unexpected '(' at token "("
0(63) : error C0000: syntax error, unexpected '(' at token "("
0(74) : error C1121: main: function type parameters not allowed

nvm, fixed it, the shader now works completely (and just like Unity).

Send me your e-mail right away to pick up a prize.
Last edit: 8 years 1 month ago by matsilagi.
The following user(s) said Thank You: kingeric1992

Please Log in or Create an account to join the conversation.

  • kingeric1992
More
8 years 1 month ago - 8 years 1 month ago #4 by kingeric1992 Replied by kingeric1992 on topic Custom motion blur
good to hear.
and a prize? you can send mails here: kingeric1992311@yahoo.com
Last edit: 8 years 1 month ago by kingeric1992.

Please Log in or Create an account to join the conversation.

We use cookies
We use cookies on our website. Some of them are essential for the operation of the forum. You can decide for yourself whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.