diff options
Diffstat (limited to 'source/blender/gpu/shaders/gpu_shader_image_overlays_stereo_merge_frag.glsl')
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_image_overlays_stereo_merge_frag.glsl | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_image_overlays_stereo_merge_frag.glsl b/source/blender/gpu/shaders/gpu_shader_image_overlays_stereo_merge_frag.glsl new file mode 100644 index 00000000000..c6e9860d940 --- /dev/null +++ b/source/blender/gpu/shaders/gpu_shader_image_overlays_stereo_merge_frag.glsl @@ -0,0 +1,47 @@ +#define S3D_DISPLAY_ANAGLYPH 0 +#define S3D_DISPLAY_INTERLACE 1 + +#define S3D_INTERLACE_ROW 0 +#define S3D_INTERLACE_COLUMN 1 +#define S3D_INTERLACE_CHECKERBOARD 2 + +/* Composite stereo textures */ + +uniform sampler2D imageTexture; +uniform sampler2D overlayTexture; + +uniform int stereoDisplaySettings; + +#define stereo_display_mode (stereoDisplaySettings & ((1 << 3) - 1)) +#define stereo_interlace_mode ((stereoDisplaySettings >> 3) & ((1 << 3) - 1)) +#define stereo_interlace_swap bool(stereoDisplaySettings >> 6) + +layout(location = 0) out vec4 imageColor; +layout(location = 1) out vec4 overlayColor; + +bool interlace(ivec2 texel) +{ + int interlace_mode = stereo_interlace_mode; + if (interlace_mode == S3D_INTERLACE_CHECKERBOARD) { + return ((texel.x + texel.y) & 1) != 0; + } + else if (interlace_mode == S3D_INTERLACE_ROW) { + return (texel.y & 1) != 0; + } + else if (interlace_mode == S3D_INTERLACE_COLUMN) { + return (texel.x & 1) != 0; + } +} + +void main() +{ + ivec2 texel = ivec2(gl_FragCoord.xy); + + if (stereo_display_mode == S3D_DISPLAY_INTERLACE && + (interlace(texel) == stereo_interlace_swap)) { + discard; + } + + imageColor = texelFetch(imageTexture, texel, 0); + overlayColor = texelFetch(overlayTexture, texel, 0); +} |