mirror of
https://github.com/cemu-project/cemu_graphic_packs.git
synced 2024-12-23 16:31:50 +01:00
549758507f
But now done properly! Basically, a bunch of improvements were made to the script. The previous attempt at this conversion was quickly followed by a rollback since I realized that the script was overlooking certain things that made most of the packs hit or miss whether they would work. A few things missing were: - It only tested the values from 1 preset. Now, each shader gets compiled per each preset, like what Cemu would do. It also merges the changes done for each preset into one. This should solve cases where one shader would define things separately or repeatedly from preset to preset. - All* of the shaders are tested to see if they use the converter used the right values for the locations for Vulkan. Both of these *should* mean that they should both compile and be linkable in Vulkan, which means that I don't have to test each individual shader to see if they work. I will release the two scripts (one used for converting, one used for checking the right values for the locations) tomorrow so that other people might be able to help, if they want. It's fairly straightforward now at least. * Organize workaround graphic packs Pretty hard to organize these correctly, but according to our discord discussion, this was the best layout from a bunch I proposed, together with some suggestions. * Add V4 converter script and instructions on how to use it Now everyone BotW is done and all of the bugs have been kinked out using it (hopefully...), here's the release of the converter script in all of it's very badly coded glory. I hope I didn't leave too much debug glory in there... Also, I hope that I didn't make too many grammatical mistakes in the instructions, but hopefully it's easy enough to follow.
190 lines
6.8 KiB
Plaintext
190 lines
6.8 KiB
Plaintext
#version 420
|
|
#extension GL_ARB_texture_gather : enable
|
|
#ifdef VULKAN
|
|
#define ATTR_LAYOUT(__vkSet, __location) layout(set = __vkSet, location = __location)
|
|
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation, std140)
|
|
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation)
|
|
#define SET_POSITION(_v) gl_Position = _v; gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0
|
|
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale.xy,gl_FragCoord.zw)
|
|
#define gl_VertexID gl_VertexIndex
|
|
#define gl_InstanceID gl_InstanceIndex
|
|
#else
|
|
#define ATTR_LAYOUT(__vkSet, __location) layout(location = __location)
|
|
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation, std140)
|
|
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation)
|
|
#define SET_POSITION(_v) gl_Position = _v
|
|
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale,gl_FragCoord.zw)
|
|
#endif
|
|
// This shaders was auto-converted from OpenGL to Cemu.
|
|
|
|
// shader de960d36a997b34d
|
|
// Divine Laser Beams Customizer - beams
|
|
// Credit for hsv functions below
|
|
// http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl
|
|
|
|
#define RAINBOW_EFFECT $rainbow // [0 or 1] set it to 1 to enable rainbow beams effect. in that case, HUE_ROTATION is ignored
|
|
#define DISABLE_BEAMS $disableBeams // [0 or 1] set it to 1 to hide the lasers completely
|
|
#define HUE_ROTATION $hue //[0, 360] where 0 and 360 is unchanged Hue and 180 is completely opposite Hue. Check http://i.imgur.com/5UpyIGh.png
|
|
#define SATURATION_FACTOR 1.0 //[0.0, 1.0] 1.0 means unchanged Saturation, 0.0 means completely desaturated. Values above 1.0 are accepted, but they may cause clipping
|
|
#define VALUE_FACTOR 1.0 //same as above; applies to Value
|
|
#define ALPHA_FACTOR 1.0 //same as above; applies to Transparency
|
|
|
|
const float hueRotation = HUE_ROTATION / 360.0;
|
|
#ifdef VULKAN
|
|
layout(set = 1, binding = 3) uniform ufBlock
|
|
{
|
|
uniform ivec4 uf_remappedPS[3];
|
|
uniform float uf_alphaTestRef;
|
|
uniform vec4 uf_fragCoordScale;
|
|
};
|
|
#else
|
|
uniform ivec4 uf_remappedPS[3];
|
|
uniform float uf_alphaTestRef;
|
|
uniform vec2 uf_fragCoordScale;
|
|
#endif
|
|
// uf_alphaTestRef was moved to the ufBlock
|
|
TEXTURE_LAYOUT(0, 1, 0) uniform sampler2D textureUnitPS0;
|
|
TEXTURE_LAYOUT(1, 1, 1) uniform sampler2D textureUnitPS1;
|
|
TEXTURE_LAYOUT(4, 1, 2) uniform sampler2D textureUnitPS4;
|
|
layout(location = 0) in vec4 passParameterSem0;
|
|
layout(location = 1) in vec4 passParameterSem1;
|
|
layout(location = 2) in vec4 passParameterSem3;
|
|
layout(location = 3) in vec4 passParameterSem4;
|
|
layout(location = 4) in vec4 passParameterSem5;
|
|
layout(location = 5) in vec4 passParameterSem8;
|
|
layout(location = 6) in vec4 passParameterSem12;
|
|
layout(location = 7) in vec4 passParameterSem14;
|
|
layout(location = 0) out vec4 passPixelColor0;
|
|
// uf_fragCoordScale was moved to the ufBlock
|
|
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){ if( a == 0.0 || b == 0.0 ) return 0.0; return a*b; }
|
|
vec3 rgb2hsv(vec3 c) {
|
|
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
|
|
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
|
|
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
|
|
|
|
float d = q.x - min(q.w, q.y);
|
|
float e = 1.0e-10;
|
|
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
|
|
}
|
|
vec3 hsv2rgb(vec3 c) {
|
|
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
|
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
|
|
}
|
|
void main()
|
|
{
|
|
#if (DISABLE_BEAMS == 1) && (RAINBOW_EFFECT == 0)
|
|
discard;
|
|
#endif
|
|
vec4 R0f = vec4(0.0);
|
|
vec4 R1f = vec4(0.0);
|
|
vec4 R2f = vec4(0.0);
|
|
vec4 R3f = vec4(0.0);
|
|
vec4 R4f = vec4(0.0);
|
|
vec4 R5f = vec4(0.0);
|
|
vec4 R6f = vec4(0.0);
|
|
vec4 R7f = vec4(0.0);
|
|
vec4 R123f = vec4(0.0);
|
|
vec4 R127f = 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;
|
|
R1f = passParameterSem1;
|
|
R2f = passParameterSem3;
|
|
R3f = passParameterSem4;
|
|
R4f = passParameterSem5;
|
|
R5f = passParameterSem8;
|
|
R6f = passParameterSem12;
|
|
R7f = passParameterSem14;
|
|
R1f.w = (texture(textureUnitPS0, R5f.xy).x);
|
|
// 0
|
|
backupReg0f = R4f.y;
|
|
R127f.x = 1.0;
|
|
R4f.y = R5f.w + 0.0;
|
|
R3f.z = -(R3f.y) + backupReg0f;
|
|
R123f.w = (R1f.w * 2.0 + -(1.0));
|
|
PV0f.w = R123f.w;
|
|
PS0f = 1.0 / R2f.w;
|
|
// 1
|
|
backupReg0f = R5f.z;
|
|
R5f.x = mul_nonIEEE(R2f.x, PS0f);
|
|
R5f.y = mul_nonIEEE(R2f.y, PS0f);
|
|
R5f.z = R0f.x + -(R1f.x);
|
|
R5f.w = R0f.y + -(R1f.y);
|
|
R4f.x = (PV0f.w * intBitsToFloat(0x3dcccccd) + backupReg0f);
|
|
PS1f = R4f.x;
|
|
// 2
|
|
backupReg0f = R6f.y;
|
|
tempf.x = dot(vec4(R6f.x,backupReg0f,R6f.z,R127f.x),vec4(intBitsToFloat(uf_remappedPS[0].x),intBitsToFloat(uf_remappedPS[0].y),intBitsToFloat(uf_remappedPS[0].z),intBitsToFloat(uf_remappedPS[0].w)));
|
|
PV0f.x = tempf.x;
|
|
PV0f.y = tempf.x;
|
|
PV0f.z = tempf.x;
|
|
PV0f.w = tempf.x;
|
|
R6f.y = tempf.x;
|
|
R6f.x = 1.0 / R2f.w;
|
|
PS0f = R6f.x;
|
|
R5f.x = (texture(textureUnitPS4, R5f.xy).x);
|
|
R4f.xyzw = (texture(textureUnitPS1, R4f.xy).xyzw);
|
|
// 0
|
|
R127f.x = mul_nonIEEE(R0f.w, R4f.w);
|
|
R127f.y = (mul_nonIEEE(intBitsToFloat(uf_remappedPS[1].w),R5f.x) + intBitsToFloat(uf_remappedPS[1].x));
|
|
PV0f.z = -(R3f.y) + -(R6f.y);
|
|
PV0f.w = R2f.z * R6f.x;
|
|
PS0f = 1.0 / R3f.z;
|
|
// 1
|
|
PV1f.x = mul_nonIEEE(PV0f.z, PS0f);
|
|
PV1f.x = clamp(PV1f.x, 0.0, 1.0);
|
|
R123f.y = (mul_nonIEEE(PV0f.w,intBitsToFloat(uf_remappedPS[1].w)) + -(intBitsToFloat(uf_remappedPS[1].y)));
|
|
PV1f.y = R123f.y;
|
|
R127f.w = R0f.z + -(R1f.z);
|
|
R0f.x = (mul_nonIEEE(R5f.z,R4f.x) + R1f.x);
|
|
PS1f = R0f.x;
|
|
// 2
|
|
R0f.y = (mul_nonIEEE(R5f.w,R4f.y) + R1f.y);
|
|
R127f.z = mul_nonIEEE(R127f.x, PV1f.x);
|
|
R127f.z = clamp(R127f.z, 0.0, 1.0);
|
|
PS0f = 1.0 / PV1f.y;
|
|
// 3
|
|
R0f.z = (mul_nonIEEE(R127f.w,R4f.z) + R1f.z);
|
|
PV1f.w = -(intBitsToFloat(uf_remappedPS[1].z)) * PS0f;
|
|
R127f.w = 1.0 / intBitsToFloat(uf_remappedPS[2].y);
|
|
PS1f = R127f.w;
|
|
// 4
|
|
PV0f.x = -(PV1f.w) + R127f.y;
|
|
// 5
|
|
PV1f.z = PV0f.x * R127f.w;
|
|
PV1f.z = clamp(PV1f.z, 0.0, 1.0);
|
|
// 6
|
|
PV0f.y = mul_nonIEEE(R127f.z, PV1f.z);
|
|
// 7
|
|
PV1f.x = mul_nonIEEE(R3f.x, PV0f.y);
|
|
// 8
|
|
R0f.w = mul_nonIEEE(R7f.w, PV1f.x);
|
|
// export
|
|
if( ((vec4(R0f.x, R0f.y, R0f.z, R0f.w)).a > uf_alphaTestRef) == false) discard;
|
|
passPixelColor0 = vec4(R0f.x, R0f.y, R0f.z, R0f.w);
|
|
vec3 colhsv = rgb2hsv(passPixelColor0.rgb);
|
|
#if (RAINBOW_EFFECT == 1)
|
|
passPixelColor0.rgb = hsv2rgb(vec3(mod(colhsv.x + 3.0*R5f.y, 1.0), colhsv.y*SATURATION_FACTOR, colhsv.z*VALUE_FACTOR));
|
|
#else
|
|
passPixelColor0.rgb = hsv2rgb(vec3(mod(colhsv.x + hueRotation, 1.0), colhsv.y*SATURATION_FACTOR, colhsv.z*VALUE_FACTOR));
|
|
#endif
|
|
passPixelColor0.a *= ALPHA_FACTOR;
|
|
}
|