slang-shaders/stereoscopic-3d/shaders/fubax_vr/VR_nose.slang

96 lines
2.1 KiB
Plaintext
Raw Normal View History

#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;
}