[Bf-blender-cvs] [3fbafaffa11] blender2.8: Eevee: Add tonemapping using ocio.

Clément Foucault noreply at git.blender.org
Thu May 11 16:29:46 CEST 2017


Commit: 3fbafaffa11632e3b9f7011317060777c48040aa
Author: Clément Foucault
Date:   Thu May 11 16:20:10 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB3fbafaffa11632e3b9f7011317060777c48040aa

Eevee: Add tonemapping using ocio.

Actually it's done by the Draw Manager, so other engines can use it.

===================================================================

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/intern/gpu_shader.c
R074	source/blender/draw/engines/eevee/shaders/tonemap_frag.glsl	source/blender/gpu/shaders/gpu_shader_image_linear_frag.glsl

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 343f08343fd..fa625f608a1 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -126,7 +126,6 @@ data_to_c_simple(engines/eevee/shaders/probe_vert.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/shadow_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/shadow_geom.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/shadow_vert.glsl SRC)
-data_to_c_simple(engines/eevee/shaders/tonemap_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/bsdf_lut_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/bsdf_direct_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/bsdf_common_lib.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 429bb3c790e..d150bf1720c 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -64,8 +64,6 @@ static struct {
 	struct GPUShader *dof_downsample_sh;
 	struct GPUShader *dof_scatter_sh;
 	struct GPUShader *dof_resolve_sh;
-
-	struct GPUShader *tonemap_sh;
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_effect_motion_blur_frag_glsl[];
@@ -174,10 +172,6 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 		                                                                                          "#define HIGH_QUALITY\n");
 	}
 
-	if (!e_data.tonemap_sh) {
-		e_data.tonemap_sh = DRW_shader_create_fullscreen(datatoc_tonemap_frag_glsl, NULL);
-	}
-
 	if (!stl->effects) {
 		stl->effects = MEM_callocN(sizeof(EEVEE_EffectsInfo), "EEVEE_EffectsInfo");
 	}
@@ -489,16 +483,6 @@ void EEVEE_effects_cache_init(EEVEE_Data *vedata)
 		DRW_shgroup_uniform_vec3(grp, "dofParams", effects->dof_params, 1);
 		DRW_shgroup_call_add(grp, quad, NULL);
 	}
-
-	{
-		/* Final pass : Map HDR color to LDR color.
-		 * Write result to the default color buffer */
-		psl->tonemap = DRW_pass_create("Tone Mapping", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND);
-
-		DRWShadingGroup *grp = DRW_shgroup_create(e_data.tonemap_sh, psl->tonemap);
-		DRW_shgroup_uniform_buffer(grp, "hdrColorBuf", &effects->source_buffer);
-		DRW_shgroup_call_add(grp, quad, NULL);
-	}
 }
 
 #define SWAP_BUFFERS() {                           \
@@ -624,13 +608,11 @@ void EEVEE_draw_effects(EEVEE_Data *vedata)
 	DRW_framebuffer_bind(dfbl->default_fb);
 
 	/* Tonemapping */
-	/* TODO : use OCIO */
-	DRW_draw_pass(psl->tonemap);
+	DRW_transform_to_display(effects->source_buffer);
 }
 
 void EEVEE_effects_free(void)
 {
-	DRW_SHADER_FREE_SAFE(e_data.tonemap_sh);
 	DRW_SHADER_FREE_SAFE(e_data.motion_blur_sh);
 	DRW_SHADER_FREE_SAFE(e_data.dof_downsample_sh);
 	DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh);
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index ab70f415d4c..9f26db48b63 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -57,7 +57,6 @@ typedef struct EEVEE_PassList {
 	struct DRWPass *dof_down;
 	struct DRWPass *dof_scatter;
 	struct DRWPass *dof_resolve;
-	struct DRWPass *tonemap;
 
 	struct DRWPass *depth_pass;
 	struct DRWPass *depth_pass_cull;
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index bcc3277adc9..8f1ee805584 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -208,6 +208,8 @@ void DRW_framebuffer_texture_detach(struct GPUTexture *tex);
 void DRW_framebuffer_blit(struct GPUFrameBuffer *fb_read, struct GPUFrameBuffer *fb_write, bool depth);
 void DRW_framebuffer_viewport_size(struct GPUFrameBuffer *UNUSED(fb_read), int w, int h);
 
+void DRW_transform_to_display(struct GPUTexture *tex);
+
 /* Shaders */
 struct GPUShader *DRW_shader_create(
         const char *vert, const char *geom, const char *frag, const char *defines);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 33456e20163..b4efadc077d 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -53,6 +53,7 @@
 #include "GPU_draw.h"
 #include "GPU_extensions.h"
 #include "GPU_framebuffer.h"
+#include "GPU_immediate.h"
 #include "GPU_lamp.h"
 #include "GPU_material.h"
 #include "GPU_shader.h"
@@ -61,6 +62,8 @@
 #include "GPU_viewport.h"
 #include "GPU_matrix.h"
 
+#include "IMB_colormanagement.h"
+
 #include "PIL_time.h"
 
 #include "RE_engine.h"
@@ -1917,6 +1920,52 @@ void DRW_framebuffer_viewport_size(struct GPUFrameBuffer *UNUSED(fb_read), int w
 	glViewport(0, 0, w, h);
 }
 
+/* Use color management profile to draw texture to framebuffer */
+void DRW_transform_to_display(GPUTexture *tex)
+{
+	DRW_state_set(DRW_STATE_WRITE_COLOR);
+
+	VertexFormat *vert_format = immVertexFormat();
+	unsigned int pos = VertexFormat_add_attrib(vert_format, "pos", COMP_F32, 2, KEEP_FLOAT);
+	unsigned int texco = VertexFormat_add_attrib(vert_format, "texCoord", COMP_F32, 2, KEEP_FLOAT);
+
+	const float dither = 1.0f;
+
+	bool use_ocio = IMB_colormanagement_setup_glsl_draw_from_space_ctx(DST.draw_ctx.evil_C, NULL, dither, false);
+
+	if (!use_ocio) {
+		immBindBuiltinProgram(GPU_SHADER_2D_IMAGE_LINEAR_TO_SRGB);
+		immUniform1i("image", 0);
+	}
+
+	GPU_texture_bind(tex, 0); /* OCIO texture bind point is 0 */
+
+	float mat[4][4];
+	unit_m4(mat);
+	immUniformMatrix4fv("ModelViewProjectionMatrix", mat);
+
+	/* Full screen triangle */
+	immBegin(PRIM_TRIANGLES, 3);
+	immAttrib2f(texco, 0.0f, 0.0f);
+	immVertex2f(pos, -1.0f, -1.0f);
+
+	immAttrib2f(texco, 2.0f, 0.0f);
+	immVertex2f(pos, 3.0f, -1.0f);
+
+	immAttrib2f(texco, 0.0f, 2.0f);
+	immVertex2f(pos, -1.0f, 3.0f);
+	immEnd();
+
+	GPU_texture_unbind(tex);
+
+	if (use_ocio) {
+		IMB_colormanagement_finish_glsl_draw();
+	}
+	else {
+		immUnbindProgram();
+	}
+}
+
 /** \} */
 
 
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 52c80448df1..ece89dbde62 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -142,6 +142,7 @@ data_to_c_simple(shaders/gpu_shader_2D_line_dashed_geom.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_2D_smooth_color_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_2D_smooth_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_2D_image_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_image_linear_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_image_shuffle_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_image_mask_uniform_color_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_image_modulate_alpha_frag.glsl SRC)
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 631970bf01a..3f761cadfc2 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -125,6 +125,7 @@ typedef enum GPUBuiltinShader {
 	GPU_SHADER_3D_DEPTH_ONLY,
 	GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR,
 	/* basic image drawing */
+	GPU_SHADER_2D_IMAGE_LINEAR_TO_SRGB,
 	GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR,
 	GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR,
 	GPU_SHADER_3D_IMAGE_MODULATE_ALPHA,
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 6710a557093..de5bda3a0cb 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -64,6 +64,7 @@ extern char datatoc_gpu_shader_2D_smooth_color_frag_glsl[];
 extern char datatoc_gpu_shader_2D_image_vert_glsl[];
 
 extern char datatoc_gpu_shader_3D_image_vert_glsl[];
+extern char datatoc_gpu_shader_image_linear_frag_glsl[];
 extern char datatoc_gpu_shader_image_color_frag_glsl[];
 extern char datatoc_gpu_shader_image_alpha_color_frag_glsl[];
 extern char datatoc_gpu_shader_image_shuffle_color_frag_glsl[];
@@ -696,6 +697,8 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
 		                               datatoc_gpu_shader_flat_color_frag_glsl },
 		[GPU_SHADER_2D_SMOOTH_COLOR] = { datatoc_gpu_shader_2D_smooth_color_vert_glsl,
 		                                 datatoc_gpu_shader_2D_smooth_color_frag_glsl },
+		[GPU_SHADER_2D_IMAGE_LINEAR_TO_SRGB] = { datatoc_gpu_shader_2D_image_vert_glsl,
+		                                         datatoc_gpu_shader_image_linear_frag_glsl },
 		[GPU_SHADER_2D_IMAGE_COLOR] = { datatoc_gpu_shader_2D_image_vert_glsl,
 		                                datatoc_gpu_shader_image_color_frag_glsl },
 		[GPU_SHADER_2D_IMAGE_ALPHA_COLOR] = { datatoc_gpu_shader_2D_image_vert_glsl,
diff --git a/source/blender/draw/engines/eevee/shaders/tonemap_frag.glsl b/source/blender/gpu/shaders/gpu_shader_image_linear_frag.glsl
similarity index 74%
rename from source/blender/draw/engines/eevee/shaders/tonemap_frag.glsl
rename to source/blender/gpu/shaders/gpu_shader_image_linear_frag.glsl
index cb2ceb5ed07..c2b25cc8011 100644
--- a/source/blender/draw/engines/eevee/shaders/tonemap_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_image_linear_frag.glsl
@@ -1,7 +1,9 @@
 
-uniform sampler2D hdrColorBuf;
+/* Display a linear image texture into sRGB space */
 
-in vec4 uvcoordsvar;
+uniform sampler2D image;
+
+in vec2 texCoord_interp;
 
 out vec4 fragColor;
 
@@ -22,7 +24,7 @@ void linearrgb_to_srgb(vec4 col_from, out vec4 col_to)
 }
 
 void main() {
-	fragColor = texture(hdrColorBuf, uvcoordsvar.st);
+	fragColor = texture(image, texCoord_interp.st);
 
 	linearrgb_to_srgb(fragColor, fragColor);
 }
\ No newline at end of file




More information about the Bf-blender-cvs mailing list