diff --git a/test/nonfunctional/gtu-famicom.slangp b/test/nonfunctional/gtu-famicom.slangp index 88d3038..141fa95 100644 --- a/test/nonfunctional/gtu-famicom.slangp +++ b/test/nonfunctional/gtu-famicom.slangp @@ -1,27 +1,27 @@ shaders = 5 -shader0 = shaders/gtu-famicom/DAC.slang +shader0 = shaders/gtu-famicom/DAC_LUT.slang scale_type_x0 = source scale_x0 = 8.0 scale_type_y0 = source scale_y0 = 1.0 -float_framebuffer0 = true filter_linear0 = false frame_count_mod0 = 2 +float_framebuffer0 = true shader1 = shaders/gtu-famicom/lowPass.slang scale_type_1 = source scale_1 = 1.0 -float_framebuffer1 = true filter_linear1 = false frame_count_mod1 = 32 +float_framebuffer1 = true shader2 = shaders/gtu-famicom/combFilter.slang scale_type_2 = source scale_2 = 1.0 -float_framebuffer2 = true filter_linear2 = false frame_count_mod2 = 2 +float_framebuffer2 = true shader3 = shaders/gtu-famicom/scaleX.slang scale_type_x3 = viewport @@ -36,5 +36,11 @@ scale_type_x4 = source scale_x4 = 1.0 scale_type_y4 = viewport scale_y4 = 1.0 -float_framebuffer4 = true filter_linear4 = false +float_framebuffer4 = true + +textures = nestable +nestable = shaders/gtu-famicom/NesTable.png +nestable_linear = false +nestable_mipmap = false +nestable_wrap_mode = clamp_to_border \ No newline at end of file diff --git a/test/nonfunctional/shaders/gtu-famicom/DAC_LUT.slang b/test/nonfunctional/shaders/gtu-famicom/DAC_LUT.slang new file mode 100644 index 0000000..9a0de0e --- /dev/null +++ b/test/nonfunctional/shaders/gtu-famicom/DAC_LUT.slang @@ -0,0 +1,50 @@ +#version 450 + +layout(std140, set = 0, binding = 0) uniform UBO +{ + mat4 MVP; + vec4 OutputSize; + vec4 OriginalSize; + vec4 SourceSize; + uint FrameCount; +} global; + +//////////////////////////////////////////////////////// +// GTU-famicom version 0.50 +// Author: aliaspider - aliaspider@gmail.com +// License: GPLv3 +//////////////////////////////////////////////////////// + +#define GET_LEVEL(X) ((X)*(255.0f / (128.0f*(1.962f-.518f)))-(.518f / (1.962f-.518f))) + +#pragma stage vertex +layout(location = 0) in vec4 Position; +layout(location = 1) in vec2 TexCoord; +layout(location = 0) out vec2 vTexCoord; +layout(location = 1) out float colorPhase; + +void main() +{ + gl_Position = global.MVP * Position; + vTexCoord = TexCoord; + vec2 pos = (vTexCoord.xy*global.OutputSize.xy)-0.5; + colorPhase = 8.0001 + pos.x + pos.y * 4.0001 + global.FrameCount * 4.0001; +} + +#pragma stage fragment +layout(location = 0) in vec2 vTexCoord; +layout(location = 1) in float colorPhase; +layout(location = 0) out vec4 FragColor; +layout(set = 0, binding = 2) uniform sampler2D Source; +layout(set = 0, binding = 3) uniform sampler2D nestable; + +void main() +{ + vec4 c = texture(Source, vTexCoord.xy); + + vec2 pixmapCoord; + pixmapCoord.x = c.x * (15.0 / (16.0 * 4.0)) + c.y * (3.0 / 4.0) +(0.5 / (16.0 * 4.0)); + pixmapCoord.y = 1.0 - (floor(mod(colorPhase + 0.5, 12.0)) / (12.0 * 8.0) + c.z * (7.0 / 8.0) + (0.5 / (12.0 * 8.0))); + + FragColor = vec4(GET_LEVEL(texture(nestable, pixmapCoord.xy).r));//vec4(signal); +} \ No newline at end of file diff --git a/test/nonfunctional/shaders/gtu-famicom/NesTable.png b/test/nonfunctional/shaders/gtu-famicom/NesTable.png new file mode 100644 index 0000000..929fa72 Binary files /dev/null and b/test/nonfunctional/shaders/gtu-famicom/NesTable.png differ diff --git a/test/nonfunctional/shaders/gtu-famicom/combFilter.slang b/test/nonfunctional/shaders/gtu-famicom/combFilter.slang index 6b33cf1..2d256b9 100644 --- a/test/nonfunctional/shaders/gtu-famicom/combFilter.slang +++ b/test/nonfunctional/shaders/gtu-famicom/combFilter.slang @@ -24,8 +24,6 @@ layout(std140, set = 0, binding = 0) uniform UBO // License: GPLv3 //////////////////////////////////////////////////////// -//#include "config.h" - #define pi 3.14159265358 #pragma stage vertex @@ -38,8 +36,8 @@ void main() { gl_Position = global.MVP * Position; vTexCoord = TexCoord; - vec2 pos = (vTexCoord.xy*params.OutputSize.xy)-0.5; - colorPhase = 8.0001 + pos.x + pos.y * 4.0001 + params.FrameCount * 4.0001 + 4.0001 + params.phaseOffset * 12.0001; + vec2 pos = (vTexCoord.xy * params.OutputSize.xy * params.SourceSize.xy * params.SourceSize.zw) - 0.5; + colorPhase = 8.0 + pos.x + pos.y * 4.0 + params.FrameCount * 4.0 + 4.0 + params.phaseOffset * 12.0; } #pragma stage fragment @@ -56,18 +54,19 @@ void main() if (params.combFilter > 0.0) { - float prev6 = texture(Source, vTexCoord.xy - vec2(5.9999 * (params.OutputSize.z), 0.0)).r; - signal = (current + prev6) / 2.0001; + float prev6 = texture(Source, vTexCoord.xy - vec2(6.0 * (params.OutputSize.x * params.SourceSize.x * params.SourceSize.z), 0.0)).r; + signal = (current + prev6) / 2.0; float chromaSignal = current - signal; - I = chromaSignal * cos (colorPhase * (2.0001 * pi / 12.0001))*2.0001; - Q = chromaSignal * sin (colorPhase * (2.0001 * pi / 12.0001))*2.0001; + I = chromaSignal * cos (colorPhase * (2.0 * pi / 12.0)) * 2.0; + Q = chromaSignal * sin (colorPhase * (2.0 * pi / 12.0)) * 2.0; } else { signal = current; - I = signal * cos (colorPhase * (2.0001 * pi / 12.0001))*2.0001; - Q = signal * sin (colorPhase * (2.0001 * pi / 12.0001))*2.0001; + I = signal * cos (colorPhase * (2.0 * pi / 12.0))*2.0; + Q = signal * sin (colorPhase * (2.0 * pi / 12.0))*2.0; } FragColor = vec4(signal, I, Q, 1.0); -} \ No newline at end of file +} + diff --git a/test/nonfunctional/shaders/gtu-famicom/lowPass.slang b/test/nonfunctional/shaders/gtu-famicom/lowPass.slang index 390ff56..c5879bd 100644 --- a/test/nonfunctional/shaders/gtu-famicom/lowPass.slang +++ b/test/nonfunctional/shaders/gtu-famicom/lowPass.slang @@ -37,7 +37,7 @@ layout(std140, set = 0, binding = 0) uniform UBO #define S(i) (texture(Source, vec2(vTexCoord.x - X(i)/params.SourceSize.x,vTexCoord.y)).x) #define VAL(i) (S(i)*STU(X(i),(params.signalResolution * params.SourceSize.z))) -float rand(vec2 co) +float rand2(vec2 co) { float c = 43758.5453; float dt= dot(co.xy ,vec2(12.9898,78.233)); @@ -45,6 +45,9 @@ float rand(vec2 co) return fract(sin(sn) * c); } +float rand(vec2 co){ + return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453); +} #pragma stage vertex layout(location = 0) in vec4 Position; diff --git a/test/nonfunctional/shaders/gtu-famicom/scaleX.slang b/test/nonfunctional/shaders/gtu-famicom/scaleX.slang index 368e31e..31d153f 100644 --- a/test/nonfunctional/shaders/gtu-famicom/scaleX.slang +++ b/test/nonfunctional/shaders/gtu-famicom/scaleX.slang @@ -28,7 +28,6 @@ layout(std140, set = 0, binding = 0) uniform UBO // License: GPLv3 //////////////////////////////////////////////////////// -#define YIQ_to_RGB mat3x3( 1.0 , 1.0 , 1.0 , 0.9563 , -0.2721 , -1.1070 , 0.6210 , -0.6474 , 1.7046 ) #define pi 3.14159265358 float d(float x, float b){ @@ -60,7 +59,8 @@ layout(set = 0, binding = 2) uniform sampler2D Source; void main() { float offset = fract((vTexCoord.x * params.SourceSize.x) - 0.5); - vec3 tempColor = vec3(0.0); + vec3 YIQ = vec3(0.0); + vec3 RGB = vec3(0.0); float X; vec3 c; float Y = params.signalResolutionY * params.SourceSize.z; @@ -77,10 +77,12 @@ void main() c.x *= ((d(X,Y) + sin(d(X,Y)) - e(X,Y) - sin(e(X,Y))) / (2.0 * pi)); c.y *= ((d(X,I) + sin(d(X,I)) - e(X,I) - sin(e(X,I))) / (2.0 * pi)); c.z *= ((d(X,Q) + sin(d(X,Q)) - e(X,Q) - sin(e(X,Q))) / (2.0 * pi)); - tempColor+=c; + YIQ+=c; } - tempColor=clamp(YIQ_to_RGB * tempColor,0.0,1.0); - - FragColor = vec4(tempColor, 1.0); + RGB.r = YIQ.r + 0.956 * YIQ.g + 0.621 * YIQ.b; + RGB.g = YIQ.r - 0.272 * YIQ.g - 0.647 * YIQ.b; + RGB.b = YIQ.r - 1.106 * YIQ.g + 1.703 * YIQ.b; + + FragColor = vec4(clamp(RGB, 0.0, 1.0), 1.0); } \ No newline at end of file