From 3f5adab81564cb948d7cda26a84dfd76b4cac706 Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Wed, 18 Dec 2019 07:50:49 +0100 Subject: [PATCH] examples: New example source shaders --- CONTRIBUTING.md | 2 +- data/examples/shaders/source/example.effect | 207 ++++++++++++-------- data/examples/shaders/source/plasma.effect | 111 +++++++++++ 3 files changed, 241 insertions(+), 79 deletions(-) create mode 100644 data/examples/shaders/source/plasma.effect diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d4a13b55..4d8894a9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -38,7 +38,7 @@ The subject line of a commit should begin with the prefix followed by a `: `, an ### Prefixes - effects: Anything modifying generic effects like blur.effect, color-conversion.effect, mask.effect, etc. - locale: Changes in `/data/locale`. -- shaders: Changes in `/data/shaders` that are not directly influenced by a change to custom shaders. +- examples: Changes in `/data/examples` that are not directly influenced by a change to one of the filters, sources or transitions. - project: Changes to files like README, CONTRIBUTING, AUTHORS, etc. - cmake: Changes to CMake build scripts. - ci: Changes to Continuous Integration. diff --git a/data/examples/shaders/source/example.effect b/data/examples/shaders/source/example.effect index e6fb4c30..7f3a05da 100644 --- a/data/examples/shaders/source/example.effect +++ b/data/examples/shaders/source/example.effect @@ -8,46 +8,65 @@ uniform float4x4 ViewProj< uniform float4 Time< bool visible = false; string name = "Time Array"; - string description = "A float4 value containing the total time, rendering time and the time since the last tick. The last value is a random number between 0 and 1."; + string description = "A float array of length 4, with the indexes being:\n[0] Time Visible in Seconds\n[1] Last Render Time\n[2] Current System Time (24h looping)\n[3] Random value between 0 and 1."; >; -uniform float4x4 Random< +/*uniform float4x4 Random< bool visible = false; - string name = "Random Array"; - string description = "A float4x4 value containing random values between 0 and 1"; + string name = "Random Matrix"; + string description = "A float4x4 value containing random values between 0 and 1. Changes every frame."; >; +uniform float4x4 Seed< + bool visible = false; + string name = "Seed Matrix"; + string description = "A float4x4 value containing random seeds values between 0 and 1. Values determined once on Source creation."; +>;*/ -// Shader Parameters -uniform float4 p_my_val< +// Parameters +uniform bool BoolParameter< bool visible = true; - string name = "Color"; - float4 minimum = {0., 0., 0., 0.}; - float4 maximum = {1., 1., 1., 1.}; - float4 step = {.01, .01, .01, .01}; -> = {0., 0., 0., 1.}; - -uniform float2 p_plasma1< + string name = "Bool Parameter"; + string description = "Example"; +>; +/*uniform int IntParameter< bool visible = true; - string name = "Plasma UV 1"; - string mode = "slider"; - float2 minimum = {0., 0.}; - float2 maximum = {1., 1.}; - float2 step = {.01, .01}; -> = {0.25, 0.25}; -uniform float2 p_plasma2< + string name = "Int Parameter"; + string description = "Example"; +>; +uniform int2 Int2Parameter< bool visible = true; - string name = "Plasma UV 2"; - string mode = "slider"; - float2 minimum = {0., 0.}; - float2 maximum = {1., 1.}; - float2 step = {.01, .01}; -> = {0.75, 0.75}; -uniform float4 p_plasma_color< + string name = "Int2 Parameter"; + string description = "Example"; +>; +uniform int3 Int3Parameter< bool visible = true; - string name = "Plasma Color"; - float4 minimum = {0., 0., 0., 0.}; - float4 maximum = {1., 1., 1., 1.}; - float4 step = {.01, .01, .01, .01}; -> = {1.0, 1.0, 1.0, 1.0}; + string name = "Int3 Parameter"; + string description = "Example"; +>; +uniform int4 Int4Parameter< + bool visible = true; + string name = "Int4 Parameter"; + string description = "Example"; +>;*/ +uniform float FloatParameter< + bool visible = true; + string name = "Float Parameter"; + string description = "Example"; +>; +uniform float2 Float2Parameter< + bool visible = true; + string name = "Float2 Parameter"; + string description = "Example"; +>; +uniform float3 Float3Parameter< + bool visible = true; + string name = "Float3 Parameter"; + string description = "Example"; +>; +uniform float4 Float4Parameter< + bool visible = true; + string name = "Float4 Parameter"; + string description = "Example"; +>; // ---------- Shader Code sampler_state def_sampler { @@ -73,51 +92,12 @@ FragData VSDefault(VertData v_in) { return vert_out; } -// ---------- Random Color -float4 PS_Random(FragData v_in) : TARGET { - return float4(Random[0][0], Random[0][1], Random[0][2], 1.0); -} - -technique Random -{ - pass - { - vertex_shader = VSDefault(v_in); - pixel_shader = PS_Random(v_in); - } -} - -// ---------- Plasma Color -float4 PS_Plasma(FragData v_in) : TARGET { - float dst1 = distance(v_in.uv, p_plasma1); - float dst2 = distance(v_in.uv, p_plasma2); - - float dst1s = dst1 * dst1; - float dst2s = dst2 * dst2; - - float dst = min(dst1s, dst2s) * (50. + (1. + sin(Time.y * 5.0)) * 100.0); - - float4 t; - t.a = 1.; - t.r = p_plasma_color.r * ((1. + sin(dst)) * .5); - t.g = p_plasma_color.g * ((1. + cos(dst)) * .5); - t.b = p_plasma_color.b * ((1. + sin(dst)) * .5) * ((1. + cos(dst)) * .5); - - return t; -} - -technique Plasma -{ - pass - { - vertex_shader = VSDefault(v_in); - pixel_shader = PS_Plasma(v_in); - } -} - -// ---------- Fixed Color -float4 PS_Fixed(FragData v_in) : TARGET { - return p_my_val; +float4 PSTime(FragData v_in) : TARGET { + return float4( + cos(Time[0] * 5.) * 0.5 + 0.5, + cos(Time[0] * 0.) * 0.5 + 0.5, + cos(Time[0] * 0.) * 0.5 + 0.5, + 1.0); } technique Draw @@ -125,6 +105,77 @@ technique Draw pass { vertex_shader = VSDefault(v_in); - pixel_shader = PS_Fixed(v_in); + pixel_shader = PSTime(v_in); + } +} + +float4 PSBool(FragData v_in) : TARGET { + if (BoolParameter) + return float4( + cos(Time[0] * 5.) * 0.5 + 0.5, + cos(Time[0] * 0.) * 0.5 + 0.5, + cos(Time[0] * 0.) * 0.5 + 0.5, + 1.0); + return float4(0, 0, 0, 1.0); +} + +technique Bool +{ + pass + { + vertex_shader = VSDefault(v_in); + pixel_shader = PSBool(v_in); + } +} + +float4 PSFloat(FragData v_in) : TARGET { + return float4(FloatParameter.xxx, 1.0); +} + +technique Float +{ + pass + { + vertex_shader = VSDefault(v_in); + pixel_shader = PSFloat(v_in); + } +} + +float4 PSFloat2(FragData v_in) : TARGET { + return Float2Parameter.xxxy; +} + +technique Float2 +{ + pass + { + vertex_shader = VSDefault(v_in); + pixel_shader = PSFloat2(v_in); + } +} + +float4 PSFloat3(FragData v_in) : TARGET { + return float4(Float3Parameter, 1.0); +} + +technique Float3 +{ + pass + { + vertex_shader = VSDefault(v_in); + pixel_shader = PSFloat3(v_in); + } +} + +float4 PSFloat4(FragData v_in) : TARGET { + return Float4Parameter; +} + +technique Float4 +{ + pass + { + vertex_shader = VSDefault(v_in); + pixel_shader = PSFloat4(v_in); } } diff --git a/data/examples/shaders/source/plasma.effect b/data/examples/shaders/source/plasma.effect new file mode 100644 index 00000000..fde3f956 --- /dev/null +++ b/data/examples/shaders/source/plasma.effect @@ -0,0 +1,111 @@ +// Always provided by OBS +uniform float4x4 ViewProj< + bool visible = false; + string name = "View Projection Matrix"; +>; + +// Provided by Stream Effects +uniform float4 Time< + bool visible = false; + string name = "Time Array"; + string description = "A float array of length 4, with the indexes being:\n[0] Time Visible in Seconds\n[1] Last Render Time\n[2] Current System Time (24h looping)\n[3] Random value between 0 and 1."; +>; + +// Params +uniform float PlasmaScale< + bool visible = true; + string name = "Plasma Scale"; + float min = 100.0; + float max = 1000.0; +> = 100.0; +uniform float3 LowColor< + float min = 0.0; + float max = 100.0; +> = {0.0, 0.0, 0.0}; +uniform float3 MiddleColor< + float min = 0.0; + float max = 100.0; +> = {0.5, 0.5, 0.5}; +uniform float3 HighColor< + float min = 0.0; + float max = 100.0; +> = {1.0, 1.0, 1.0}; + +struct StageData { + float4 pos : POSITION; + float2 uv : TEXCOORD0; +}; + +StageData VSDefault(StageData data) { + data.pos = mul(float4(data.pos.xyz, 1.0), ViewProj); + return data; +} + +float Plasma1(float2 uv, float t) { + return sin(uv.x * 10 + t); +} + +float Plasma2(float2 uv, float t) { + return sin(10 * (uv.x*sin(t/2)+uv.y*cos(t/3))+t); +} + +float Plasma3(float2 uv, float t) { + float cx = uv.x + .5*sin(t/5); + float cy = uv.y + .5*cos(t/3); + return sin(sqrt(100*(cx*cx+cy*cy)+1)+t); +} + +float4 BasicPlasma(StageData data) : TARGET { + return float4(Plasma1(data.uv, Time[0]), Plasma2(data.uv, Time[0]), Plasma3(data.uv, Time[0]), 1.0); +} + +technique Basic +{ + pass + { + vertex_shader = VSDefault(data); + pixel_shader = BasicPlasma(data); + } +} + +float4 Plasma(StageData data) : TARGET { + float a = Plasma1(data.uv, Time[0]); + float b = Plasma2(data.uv, Time[0]); + float c = Plasma3(data.uv, Time[0]); + + float v = abs(sin((a + b + c) * (PlasmaScale / 100.0))); + + return float4(v,v,v, 1.0); +} + +technique Draw +{ + pass + { + vertex_shader = VSDefault(data); + pixel_shader = Plasma(data); + } +} + +float4 ColoredPlasma(StageData data) : TARGET { + float a = Plasma1(data.uv, Time[0]); + float b = Plasma2(data.uv, Time[0]); + float c = Plasma3(data.uv, Time[0]); + + float v = abs(sin((a + b + c) * (PlasmaScale / 100.0))); + + float v1 = clamp(v * 2.0, 0., 1.); + float v2 = clamp((v - 0.5) * 2.0, 0., 1.); + float3 col = lerp(lerp(LowColor, MiddleColor, v1), HighColor, v2); + + return float4(col, 1.0); +} + +technique Colored +{ + pass + { + vertex_shader = VSDefault(data); + pixel_shader = ColoredPlasma(data); + } +}