forked from yupferris/fuse-shader-playground
-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIceEffect.ux
137 lines (105 loc) · 3.77 KB
/
IceEffect.ux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<DockPanel ux:Class="IceEffect">
<Button Dock="Bottom" Text="Reset">
<Clicked>
<ClearRetainBuffer Target="HeatBuffer" />
</Clicked>
</Button>
<ShaderControl BoxSizing="FillAspect" Aspect="1" HitTestMode="LocalBoundsAndChildren">
<RetainBuffer ux:Name="HeatBuffer" Width="64" Height="64" ClearColor="0, 0, 0, 0" />
<TempBuffer ux:Name="WorkBuffer" Width="64" Height="64" />
<Pass Target="WorkBuffer">
<BufferUniform Buffer="HeatBuffer" UniformName="HeatTex" />
<Code ux:Binding="VertexCode">
attribute vec2 VertexPosition;
varying vec2 TexCoords;
void main()
{
TexCoords = VertexPosition;
gl_Position = vec4(VertexPosition * 2.0 - 1.0, 0, 1);
}
</Code>
<Code ux:Binding="FragmentCode">
uniform sampler2D HeatTex;
varying vec2 TexCoords;
void main()
{
gl_FragColor = texture2D(HeatTex, TexCoords);
}
</Code>
</Pass>
<Pass Target="HeatBuffer">
<BufferUniform Buffer="WorkBuffer" UniformName="HeatTex" />
<PointerXUniform UniformName="PointerX" />
<PointerYUniform UniformName="PointerY" />
<PointerDownUniform UniformName="PointerDown" />
<Code ux:Binding="VertexCode">
attribute vec2 VertexPosition;
varying vec2 TexCoords;
void main()
{
TexCoords = VertexPosition;
gl_Position = vec4(VertexPosition * 2.0 - 1.0, 0, 1);
}
</Code>
<Code ux:Binding="FragmentCode">
uniform sampler2D HeatTex;
varying vec2 TexCoords;
uniform float PointerX;
uniform float PointerY;
uniform float PointerDown;
void main()
{
const float texelSize = 1.0 / 64.0;
float heat = texture2D(HeatTex, TexCoords).x;
// Affect heat with neighboring heats
heat =
(heat +
texture2D(HeatTex, TexCoords - vec2(texelSize, 0.0)).x +
texture2D(HeatTex, TexCoords + vec2(texelSize, 0.0)).x +
texture2D(HeatTex, TexCoords + vec2(0.0, texelSize)).x +
texture2D(HeatTex, TexCoords - vec2(0.0, texelSize)).x) / 5.0;
// Affect heat with pointer
heat += max((1.0 - distance(TexCoords, vec2(PointerX, PointerY)) * 10.0), 0.0) * 0.5 * PointerDown;
// Dampen heat
heat -= 0.002;
gl_FragColor = vec4(heat, 0, 0, 0);
}
</Code>
</Pass>
<Pass>
<LocalToClipMatrixUniform UniformName="LocalToClipMatrix" />
<SizeUniform UniformName="Size" />
<BufferUniform Buffer="HeatBuffer" UniformName="HeatTex" />
<ImageUniform File="Assets/icecracks.png" UniformName="CracksTex" />
<ImageUniform File="Assets/icecolor.png" UniformName="ColorTex" />
<ImageUniform File="Assets/500-pcs---curious-kitten---square-by-ravensburger.jpg" UniformName="PictureTex" />
<Code ux:Binding="VertexCode">
uniform mat4 LocalToClipMatrix;
uniform vec2 Size;
attribute vec2 VertexPosition;
varying vec2 TexCoords;
void main()
{
TexCoords = VertexPosition;
gl_Position = LocalToClipMatrix * vec4(VertexPosition * Size, 0, 1);
}
</Code>
<Code ux:Binding="FragmentCode">
uniform sampler2D HeatTex;
uniform sampler2D CracksTex;
uniform sampler2D ColorTex;
uniform sampler2D PictureTex;
varying vec2 TexCoords;
void main()
{
float inputHeat = texture2D(HeatTex, TexCoords).x;
float heat = mix(inputHeat, clamp(inputHeat * 5.0, 0.0, 1.0), texture2D(CracksTex, TexCoords).x);
float white = pow(1.0 - clamp(abs(heat - 0.2) / 0.2, 0.0, 1.0), 1.6) * 0.8;
vec3 pictureColor = texture2D(PictureTex, TexCoords).xyz;
vec3 iceColor = mix(pictureColor, texture2D(ColorTex, TexCoords).xyz, 0.8);
gl_FragColor = vec4(mix(iceColor, pictureColor, heat) + white, 1);
}
</Code>
</Pass>
</ShaderControl>
</DockPanel>