Skip to content

Commit 57b86be

Browse files
committed
cCircles, cEnsor: Fixed >SM3 bugs, updated prepass
1 parent 4cc4500 commit 57b86be

File tree

2 files changed

+67
-61
lines changed

2 files changed

+67
-61
lines changed

shaders/cCircles.fx

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ uniform float3 _BackColor <
145145
[Textures and Samplers]
146146
*/
147147

148-
CREATE_TEXTURE_POOLED(TempTex0_RGBA8, BUFFER_SIZE_0, RGBA8, 8)
149-
CREATE_SRGB_SAMPLER(SampleTempTex0, TempTex0_RGBA8, LINEAR, MIRROR, MIRROR, MIRROR)
148+
CREATE_TEXTURE_POOLED(TempTex0_RGBA8_8, BUFFER_SIZE_0, RGBA8, 8)
149+
CREATE_SRGB_SAMPLER(SampleTempTex0, TempTex0_RGBA8_8, LINEAR, MIRROR, MIRROR, MIRROR)
150150

151151
sampler2D CShade_SampleColorTexMirror
152152
{
@@ -226,70 +226,69 @@ float GetTileCircleLength(Tile Input)
226226
[Pixel Shaders]
227227
*/
228228

229-
float4 PS_Blit(CShade_VS2PS_Quad Input) : SV_TARGET0
230-
{
231-
return tex2D(CShade_SampleColorTex, Input.Tex0);
232-
}
233-
234229
#if ENABLE_MONO
235-
float4 PS_Circles(CShade_VS2PS_Quad Input) : SV_TARGET0
230+
float4 PS_Blit(CShade_VS2PS_Quad Input) : SV_TARGET0
236231
{
237-
// Precalculate our needed LOD for all channels
238-
float2 TexSize = CShade_GetScreenSizeFromTex(Input.Tex0);
239-
float LOD = max(0.0, log2(max(TexSize.x, TexSize.y) / _CircleAmount));
240-
241-
// Create tiles
242-
Tile MainTiles = GetTiles(Input.Tex0.xy, _Offset);
243-
244-
// Get texture information
245-
float4 Blocks = tex2Dlod(SampleTempTex0, float4(GetBlockTex(MainTiles.Index), 0.0, LOD));
246-
Blocks = (Blocks * _InputMultiplier) + _InputBias;
247-
248-
float Feature = 0.0;
249-
232+
float4 Color = tex2D(CShade_SampleColorTex, Input.Tex0);
250233
switch(_Select)
251234
{
252235
case 0:
253-
Feature = CColor_GetHSVfromRGB(Blocks.rgb).r;
236+
Color.a = CColor_GetHSVfromRGB(Color.rgb).r;
254237
break;
255238
case 1:
256-
Feature = CColor_GetHSVfromRGB(Blocks.rgb).g;
239+
Color.a = CColor_GetHSVfromRGB(Color.rgb).g;
257240
break;
258241
case 2:
259-
Feature = CColor_GetHSVfromRGB(Blocks.rgb).b;
242+
Color.a = CColor_GetHSVfromRGB(Color.rgb).b;
260243
break;
261244
case 3:
262-
Feature = CColor_GetHSLfromRGB(Blocks.rgb).r;
245+
Color.a = CColor_GetHSLfromRGB(Color.rgb).r;
263246
break;
264247
case 4:
265-
Feature = CColor_GetHSLfromRGB(Blocks.rgb).g;
248+
Color.a = CColor_GetHSLfromRGB(Color.rgb).g;
266249
break;
267250
case 5:
268-
Feature = CColor_GetHSLfromRGB(Blocks.rgb).b;
251+
Color.a = CColor_GetHSLfromRGB(Color.rgb).b;
269252
break;
270253
case 6:
271-
Feature = CColor_GetHSIfromRGB(Blocks.rgb).r;
254+
Color.a = CColor_GetHSIfromRGB(Color.rgb).r;
272255
break;
273256
case 7:
274-
Feature = CColor_GetHSIfromRGB(Blocks.rgb).g;
257+
Color.a = CColor_GetHSIfromRGB(Color.rgb).g;
275258
break;
276259
case 8:
277-
Feature = CColor_GetHSIfromRGB(Blocks.rgb).b;
260+
Color.a = CColor_GetHSIfromRGB(Color.rgb).b;
278261
break;
279262
default:
280-
Feature = 0.0;
263+
Color.a = 1.0;
281264
break;
282265
}
283266

267+
return Color;
268+
}
269+
270+
float4 PS_Circles(CShade_VS2PS_Quad Input) : SV_TARGET0
271+
{
272+
// Precalculate our needed LOD for all channels
273+
float2 TexSize = CShade_GetScreenSizeFromTex(Input.Tex0);
274+
float LOD = max(0.0, log2(max(TexSize.x, TexSize.y) / _CircleAmount));
275+
276+
// Create tiles
277+
Tile MainTiles = GetTiles(Input.Tex0.xy, _Offset);
278+
279+
// Get texture information
280+
float4 Blocks = tex2Dlod(SampleTempTex0, float4(GetBlockTex(MainTiles.Index), 0.0, LOD));
281+
Blocks.a = (Blocks.a * _InputMultiplier) + _InputBias;
282+
284283
// Create the UV for the circles
285284
float CircleDist = GetTileCircleLength(MainTiles);
286285

287286
// Create the circle
288-
float Circles = smoothstep(0.89 - fwidth(CircleDist), 0.9, CircleDist + Feature);
287+
float Circles = smoothstep(0.89 - fwidth(CircleDist), 0.9, CircleDist + Blocks.a);
289288

290289
// Mix colors together
291290
float3 OutputColor = lerp(_FrontColor, _BackColor, Circles);
292-
OutputColor = lerp(OutputColor, _BackColor, saturate(Feature));
291+
OutputColor = lerp(OutputColor, _BackColor, saturate(Blocks.a));
293292

294293
// Crop the image
295294
OutputColor = lerp(_BackColor, OutputColor, MainTiles.Value.x > _Crop.x);
@@ -300,6 +299,11 @@ float4 PS_Blit(CShade_VS2PS_Quad Input) : SV_TARGET0
300299
return CBlend_OutputChannels(float4(OutputColor.rgb, _CShadeAlphaFactor));
301300
}
302301
#else
302+
float4 PS_Blit(CShade_VS2PS_Quad Input) : SV_TARGET0
303+
{
304+
return tex2D(CShade_SampleColorTex, Input.Tex0);
305+
}
306+
303307
float4 PS_Circles(CShade_VS2PS_Quad Input) : SV_TARGET0
304308
{
305309
// Precalculate our needed LOD for all channels
@@ -357,7 +361,7 @@ technique CShade_Circles < ui_tooltip = "Creates circles based on image features
357361
{
358362
VertexShader = CShade_VS_Quad;
359363
PixelShader = PS_Blit;
360-
RenderTarget = TempTex0_RGBA8;
364+
RenderTarget = TempTex0_RGBA8_8;
361365
}
362366

363367
pass

shaders/cEnsor.fx

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,61 +36,63 @@ uniform int _DisplayMode <
3636
#include "shared/cShade.fxh"
3737
#include "shared/cBlend.fxh"
3838

39-
CREATE_TEXTURE_POOLED(TempTex0_RGBA8, BUFFER_SIZE_0, RGBA8, 8)
40-
CREATE_SRGB_SAMPLER(SampleTempTex0, TempTex0_RGBA8, POINT, MIRROR, MIRROR, MIRROR)
39+
CREATE_TEXTURE_POOLED(TempTex0_RGBA8_8, BUFFER_SIZE_0, RGBA8, 8)
40+
CREATE_SRGB_SAMPLER(SampleTempTex0, TempTex0_RGBA8_8, POINT, MIRROR, MIRROR, MIRROR)
4141

4242
float4 PS_Blit(CShade_VS2PS_Quad Input) : SV_TARGET0
43-
{
44-
return float4(tex2D(CShade_SampleColorTex, Input.Tex0).rgb, 1.0);
45-
}
46-
47-
float4 PS_Censor(CShade_VS2PS_Quad Input) : SV_TARGET0
4843
{
4944
float4 Color = tex2D(CShade_SampleColorTex, Input.Tex0);
50-
float4 Pixel = tex2Dlod(SampleTempTex0, float4(Input.Tex0, 0.0, _Blockiness));
51-
52-
// Initialize variables
53-
float4 Feature = 0.0;
54-
bool4 Mask = false;
55-
float4 OutputColor = 0.0;
5645

5746
switch(_DetectionMode)
5847
{
5948
case 0:
60-
Feature = Pixel;
49+
Color.a = 1.0;
6150
break;
6251
case 1:
63-
Feature = CColor_GetHSVfromRGB(Pixel.rgb).r;
52+
Color.a = CColor_GetHSVfromRGB(Color.rgb).r;
6453
break;
6554
case 2:
66-
Feature = CColor_GetHSVfromRGB(Pixel.rgb).g;
55+
Color.a = CColor_GetHSVfromRGB(Color.rgb).g;
6756
break;
6857
case 3:
69-
Feature = CColor_GetHSVfromRGB(Pixel.rgb).b;
58+
Color.a = CColor_GetHSVfromRGB(Color.rgb).b;
7059
break;
7160
case 4:
72-
Feature = CColor_GetHSLfromRGB(Pixel.rgb).r;
61+
Color.a = CColor_GetHSLfromRGB(Color.rgb).r;
7362
break;
7463
case 5:
75-
Feature = CColor_GetHSLfromRGB(Pixel.rgb).g;
64+
Color.a = CColor_GetHSLfromRGB(Color.rgb).g;
7665
break;
7766
case 6:
78-
Feature = CColor_GetHSLfromRGB(Pixel.rgb).b;
67+
Color.a = CColor_GetHSLfromRGB(Color.rgb).b;
7968
break;
8069
case 7:
81-
Feature = CColor_GetHSIfromRGB(Pixel.rgb).r;
70+
Color.a = CColor_GetHSIfromRGB(Color.rgb).r;
8271
break;
8372
case 8:
84-
Feature = CColor_GetHSIfromRGB(Pixel.rgb).g;
73+
Color.a = CColor_GetHSIfromRGB(Color.rgb).g;
8574
break;
8675
case 9:
87-
Feature = CColor_GetHSIfromRGB(Pixel.rgb).b;
76+
Color.a = CColor_GetHSIfromRGB(Color.rgb).b;
8877
break;
8978
default:
90-
Feature = 0.0;
79+
Color.a = 1.0;
9180
break;
9281
}
9382

83+
return Color;
84+
}
85+
86+
float4 PS_Censor(CShade_VS2PS_Quad Input) : SV_TARGET0
87+
{
88+
float4 Color = tex2D(CShade_SampleColorTex, Input.Tex0);
89+
float4 Blocks = tex2Dlod(SampleTempTex0, float4(Input.Tex0, 0.0, _Blockiness));
90+
91+
// Initialize variables
92+
float3 Feature = (_DetectionMode == 0) ? Blocks.rgb : Blocks.aaa;
93+
bool3 Mask = false;
94+
float3 OutputColor = 0.0;
95+
9496
switch (_Comparison)
9597
{
9698
case 0:
@@ -119,10 +121,10 @@ float4 PS_Censor(CShade_VS2PS_Quad Input) : SV_TARGET0
119121
}
120122
else
121123
{
122-
OutputColor = lerp(Color, Pixel, Mask);
124+
OutputColor = lerp(Color.rgb, Blocks.rgb, Mask);
123125
}
124126

125-
return CBlend_OutputChannels(float4(OutputColor.rgb, _CShadeAlphaFactor));
127+
return CBlend_OutputChannels(float4(OutputColor, _CShadeAlphaFactor));
126128
}
127129

128130
technique CShade_Censor < ui_tooltip = "Pixelates the screen based on features"; >
@@ -131,7 +133,7 @@ technique CShade_Censor < ui_tooltip = "Pixelates the screen based on features";
131133
{
132134
VertexShader = CShade_VS_Quad;
133135
PixelShader = PS_Blit;
134-
RenderTarget = TempTex0_RGBA8;
136+
RenderTarget = TempTex0_RGBA8_8;
135137
}
136138

137139
pass

0 commit comments

Comments
 (0)