Advertisement
Krythic

Vignette Shader

Aug 15th, 2020
1,574
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.44 KB | None | 0 0
  1. struct Vertex
  2. {
  3.     float4 pos : POSITION;
  4.     float2 tex : TEXTURE;
  5.     float3 norm : NORMAL;
  6. };
  7.  
  8. struct PixelShaderArgs
  9. {
  10.     float4 pos : SV_POSITION;
  11.     float2 col : TEXTURE;
  12.     float3 norm : NORMAL;
  13. };
  14.  
  15. struct VignetteShaderData
  16. {
  17.     float2 Resolution;
  18.     float Padding1;
  19.     float Padding2;
  20.     float3 Color;
  21.     float Intensity;
  22. };
  23.  
  24. Texture2D ShaderTexture : register(t0);
  25. SamplerState Sampler : register(s0);
  26. float4x4 localMatrix : register(b0);
  27.  
  28. cbuffer VignetteShaderDataBuffer : register(b1)
  29. {
  30.     VignetteShaderData VignetteData;
  31. };
  32.  
  33. PixelShaderArgs VertexShaderMain(Vertex vertex)
  34. {
  35.     PixelShaderArgs output;
  36.     output.pos = vertex.pos;
  37.     output.col = vertex.tex;
  38.     return output;
  39. }
  40.  
  41. float4 PixelShaderMain(PixelShaderArgs pixelShaderArgs) : SV_Target
  42. {
  43.     float outerRadius = 1.2;
  44.     float innerRadius = .50;
  45.     float curvature = .31; // Because 31 is dank as fuck.
  46.     float oneOverCurve = 1.0f / curvature;
  47.     float4 diffuse = ShaderTexture.Sample(Sampler, pixelShaderArgs.col);
  48.     float2 fragmentPosition = pixelShaderArgs.pos.xy / VignetteData.Resolution;
  49.     float2 curve = pow(abs(fragmentPosition * 2.0 - 1.0), float2(oneOverCurve,oneOverCurve));
  50.     float cameraEdge = pow(length(curve), curvature);
  51.     float vignette = smoothstep(innerRadius, outerRadius, cameraEdge) * VignetteData.Intensity;
  52.     diffuse.rgb = lerp(diffuse.rgb, VignetteData.Color, vignette);
  53.     return diffuse;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement