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
This commit is contained in:
Jeroen Bakker
2020-03-19 08:06:49 +01:00
committed by Jeroen Bakker
parent fe045b2b77
commit fd48ff1296
19 changed files with 333 additions and 258 deletions

View File

@@ -1,35 +0,0 @@
/* Keep these in sync with GPU_shader.h */
#define INTERLACE_ROW 0
#define INTERLACE_COLUMN 1
#define INTERLACE_CHECKERBOARD 2
in vec2 texCoord_interp;
out vec4 fragColor;
uniform int interlace_id;
uniform sampler2D image_a;
uniform sampler2D image_b;
bool interlace()
{
if (interlace_id == INTERLACE_CHECKERBOARD) {
return (int(gl_FragCoord.x + gl_FragCoord.y) & 1) != 0;
}
else if (interlace_id == INTERLACE_ROW) {
return (int(gl_FragCoord.y) & 1) != 0;
}
else if (interlace_id == INTERLACE_COLUMN) {
return (int(gl_FragCoord.x) & 1) != 0;
}
}
void main()
{
if (interlace()) {
fragColor = texture(image_a, texCoord_interp);
}
else {
fragColor = texture(image_b, texCoord_interp);
}
}

View File

@@ -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);
}