diff options
author | Jeroen Bakker <jbakker> | 2020-03-19 10:06:49 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2020-03-19 10:26:48 +0300 |
commit | fd48ff1296f45b32bffeca2c60dca2a12bb84229 (patch) | |
tree | 250137802d4bed0628a7926df724227349320757 /source/blender/gpu/shaders/gpu_shader_image_overlays_stereo_merge_frag.glsl | |
parent | fe045b2b77dc6d7f0b552619fe824b496d34db6c (diff) |
Fix T73931: Stereo Viewport Color Management
Stereoscopic viewport didn't support Color Manangement due recent
changes in the color management pipeline. In order to solve the issue we
will migrate the strereo rendering into the GPUViewport. This will share
some textures and reduce required GPU memory.
Reviewed By: fclem, dfelinto
Differential Revision: https://developer.blender.org/D6922
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); +} |