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:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user