mirror of
https://github.com/cemu-project/cemu_graphic_packs.git
synced 2024-12-23 08:21:51 +01:00
cba5441cd8
Eyeballed nr of passes to aproximate same blur feel as native res. Old approach, from res, really started to break down around 5k.
88 lines
2.6 KiB
Plaintext
88 lines
2.6 KiB
Plaintext
#version 420
|
|
#extension GL_ARB_texture_gather : enable
|
|
#extension GL_ARB_separate_shader_objects : enable
|
|
// shader e334517825fdd599
|
|
//basline dof blur..
|
|
|
|
const float scaleBlur = $scaleBlur; //0.125 4k
|
|
const int sampleScaling = $presetPass;
|
|
|
|
#define EnableBlur $enableBlur
|
|
|
|
layout(binding = 0) uniform sampler2D textureUnitPS0;// Tex0 addr 0xf4001000 res 1920x1080x1 dim 1 tm: 4 format 001a compSel: 0 1 2 3 mipView: 0x0 (num 0x1) sliceView: 0x0 (num 0x1) Sampler0 ClampX/Y/Z: 2 2 2 border: 0
|
|
layout(location = 0) in vec4 passParameterSem0;
|
|
layout(location = 0) out vec4 passPixelColor0;
|
|
uniform vec2 uf_fragCoordScale;
|
|
|
|
|
|
const int sampleScale = 2 + sampleScaling;
|
|
|
|
//const int sampleScale = 2 + sampleScaling;
|
|
// FabriceNeyret2 CC, single shader gaussian by intermediate MIPmap level. www.shadertoy.com/view/ltScRG
|
|
const int samples = 4 * sampleScale, //8 or 4 balances xy position + brightness hack
|
|
LOD = 2, // gaussian done on MIPmap at scale LOD
|
|
sLOD = 1 << LOD; // tile size = 2^LOD
|
|
const float sigma = float(samples) * .25;
|
|
|
|
float gaussian(vec2 i) {
|
|
return exp(-.5* dot(i /= sigma, i)) / (6.28 * sigma*sigma);
|
|
}
|
|
|
|
vec4 blur(sampler2D sp, vec2 U, vec2 scale) {
|
|
vec4 O = vec4(0.0);
|
|
int s = samples / sLOD;
|
|
|
|
for (int i = 0; i < s*s; i++) {
|
|
vec2 d = vec2(i%s, i / s)*float(sLOD) - float(samples) / 2.;
|
|
O += gaussian(d) * textureLod(sp, U + scale * d, float(LOD));
|
|
}
|
|
|
|
//return O / O.a;
|
|
return vec4(O.x, O.y, O.z, 0.0)*20.0; // balance loss of brightness
|
|
}
|
|
|
|
int clampFI32(int v)
|
|
{
|
|
if( v == 0x7FFFFFFF )
|
|
return floatBitsToInt(1.0);
|
|
else if( v == 0xFFFFFFFF )
|
|
return floatBitsToInt(0.0);
|
|
return floatBitsToInt(clamp(intBitsToFloat(v), 0.0, 1.0));
|
|
}
|
|
float mul_nonIEEE(float a, float b){return mix(0.0, a*b, (a != 0.0) && (b != 0.0));}
|
|
void main()
|
|
{
|
|
vec4 R0f = vec4(0.0);
|
|
vec4 R9f = vec4(0.0);
|
|
float backupReg0f, backupReg1f, backupReg2f, backupReg3f, backupReg4f;
|
|
vec4 PV0f = vec4(0.0), PV1f = vec4(0.0);
|
|
float PS0f = 0.0, PS1f = 0.0;
|
|
vec4 tempf = vec4(0.0);
|
|
float tempResultf;
|
|
int tempResulti;
|
|
ivec4 ARi = ivec4(0);
|
|
bool predResult = true;
|
|
vec3 cubeMapSTM;
|
|
int cubeMapFaceId;
|
|
R0f = passParameterSem0;
|
|
|
|
|
|
#if (EnableBlur == 1)
|
|
vec2 scaler = uf_fragCoordScale.xy;
|
|
vec2 coord = R0f.xy*textureSize(textureUnitPS0, 0); //
|
|
vec2 ps = vec2(1.0) / textureSize(textureUnitPS0, 0);
|
|
vec2 uv = coord * ps;
|
|
|
|
R9f.xyz = blur(textureUnitPS0, R0f.xy, ps*0.5*scaleBlur*scaler).xyz;
|
|
R0f.w = (textureLod(textureUnitPS0, R0f.xy,0.0).w);
|
|
// export
|
|
passPixelColor0 = vec4(R9f.x, R9f.y, R9f.z, R0f.w);
|
|
|
|
#elif (EnableBlur == 0)
|
|
R0f.xyzw = (textureLod(textureUnitPS0, R0f.xy,0.0).xyzw);
|
|
// export
|
|
passPixelColor0 = vec4(R0f.x, R0f.y, R0f.z, R0f.w);
|
|
#endif
|
|
|
|
}
|