mirror of
https://github.com/italicsjenga/slang-shaders.git
synced 2024-11-30 11:21:32 +11:00
96 lines
2.1 KiB
Plaintext
96 lines
2.1 KiB
Plaintext
#version 450
|
|
|
|
/*
|
|
Nose PS (c) 2019 Jacob Maximilian Fober
|
|
|
|
Anti-nausea shader for VR
|
|
|
|
This work is licensed under the Creative Commons
|
|
Attribution-ShareAlike 4.0 International License.
|
|
To view a copy of this license, visit
|
|
http://creativecommons.org/licenses/by-sa/4.0/.
|
|
*/
|
|
|
|
layout(push_constant) uniform Push
|
|
{
|
|
vec4 SourceSize;
|
|
vec4 OriginalSize;
|
|
vec4 OutputSize;
|
|
uint FrameCount;
|
|
} params;
|
|
|
|
#ifndef nose
|
|
#define nose 128 // Nose texture resolution
|
|
#endif
|
|
|
|
#define mul(c,d) (d*c)
|
|
|
|
#include "fubax_vr_params.inc"
|
|
|
|
#pragma stage vertex
|
|
layout(location = 0) in vec4 Position;
|
|
layout(location = 1) in vec2 TexCoord;
|
|
layout(location = 0) out vec2 texcoord;
|
|
|
|
void main()
|
|
{
|
|
gl_Position = global.MVP * Position;
|
|
texcoord = TexCoord;
|
|
}
|
|
|
|
#pragma stage fragment
|
|
layout(location = 0) in vec2 texcoord;
|
|
layout(location = 0) out vec4 FragColor;
|
|
layout(set = 0, binding = 2) uniform sampler2D Source;
|
|
layout(set = 0, binding = 3) uniform sampler2D noseTex;
|
|
|
|
//#include "fubax_vr_shared_funcs.inc"
|
|
// Convert RGB to YUV
|
|
vec3 yuv(vec3 rgbImage)
|
|
{
|
|
// RGB to YUV709 matrix
|
|
const mat3 YUV709 =
|
|
mat3(
|
|
vec3(0.2126, 0.7152, 0.0722),
|
|
vec3(-0.09991, -0.33609, 0.436),
|
|
vec3(0.615, -0.55861, -0.05639)
|
|
);
|
|
return mul(YUV709, rgbImage);
|
|
}
|
|
|
|
// Overlay blending mode
|
|
float Overlay(float LayerAB)
|
|
{
|
|
float MinAB = min(LayerAB, 0.5);
|
|
float MaxAB = max(LayerAB, 0.5);
|
|
return 2.0 * (MinAB*MinAB + 2.0*MaxAB - MaxAB*MaxAB) - 1.5;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
vec2 UvCoord = texcoord;
|
|
// Bypass sharpening
|
|
if(!Nose)
|
|
{
|
|
FragColor = vec4(texture(Source, UvCoord).rgb, 1.0);
|
|
return;
|
|
}
|
|
|
|
// Divide screen in two (mirrored)
|
|
vec2 StereoCoord = texcoord;
|
|
StereoCoord.x = 1.0-abs(StereoCoord.x*2.0-1.0)/Scale.x;
|
|
StereoCoord.y = 1.0-(1.0-StereoCoord.y)/Scale.y;
|
|
|
|
// Sample display image
|
|
vec3 Display = texture(Source, texcoord).rgb;
|
|
// Sample nose texture
|
|
vec4 NoseTexture = texture(noseTex, StereoCoord);
|
|
// Change skintone
|
|
NoseTexture.rgb *= mix(smoothstep(0.0, 1.0, yuv(NoseTexture.rgb).x), 1.0, Brightness);
|
|
|
|
|
|
// Blend nose with display image
|
|
FragColor.rgb = mix(Display, NoseTexture.rgb, NoseTexture.a);
|
|
FragColor.a = 1.0;
|
|
}
|