[Bf-blender-cvs] [edcf128ce27] blender2.8: Eevee: Introduction of world preconvolved envmap.

Clément Foucault noreply at git.blender.org
Tue Apr 18 13:28:05 CEST 2017


Commit: edcf128ce279e1fa721a1ba16fc3a3dfeac4833b
Author: Clément Foucault
Date:   Tue Apr 18 12:50:09 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBedcf128ce279e1fa721a1ba16fc3a3dfeac4833b

Eevee: Introduction of world preconvolved envmap.

For now only compute GGX convolution. The GGX LUT used for the split sum approximation (UE4) is merged with the LTX mag LUT that uses the same parameters (theta and roughness)

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee.c
M	source/blender/draw/engines/eevee/eevee_lights.c
M	source/blender/draw/engines/eevee/eevee_lut.h
M	source/blender/draw/engines/eevee/eevee_private.h
A	source/blender/draw/engines/eevee/eevee_probes.c
M	source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
M	source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
A	source/blender/draw/engines/eevee/shaders/bsdf_lut_frag.glsl
A	source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl
M	source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
M	source/blender/draw/engines/eevee/shaders/ltc_lib.glsl
A	source/blender/draw/engines/eevee/shaders/probe_filter_frag.glsl
A	source/blender/draw/engines/eevee/shaders/probe_frag.glsl
A	source/blender/draw/engines/eevee/shaders/probe_geom.glsl
A	source/blender/draw/engines/eevee/shaders/probe_vert.glsl
M	source/blender/draw/engines/eevee/shaders/shadow_vert.glsl
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_draw.c
M	source/blender/gpu/intern/gpu_texture.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 06d152fe46e..22acc98a5ca 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -65,6 +65,7 @@ set(SRC
 
 	engines/eevee/eevee.c
 	engines/eevee/eevee_lights.c
+	engines/eevee/eevee_probes.c
 	engines/eevee/eevee.h
 	engines/eevee/eevee_private.h
 
@@ -103,12 +104,18 @@ data_to_c_simple(engines/clay/shaders/ssao_groundtruth.glsl SRC)
 
 data_to_c_simple(engines/eevee/shaders/lit_surface_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lit_surface_vert.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/probe_filter_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/probe_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/probe_geom.glsl SRC)
+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)
+data_to_c_simple(engines/eevee/shaders/bsdf_sampling_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/ltc_lib.glsl SRC)
 
 data_to_c_simple(modes/shaders/common_globals_lib.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee.c b/source/blender/draw/engines/eevee/eevee.c
index e028249d2bb..f1eaead42c7 100644
--- a/source/blender/draw/engines/eevee/eevee.c
+++ b/source/blender/draw/engines/eevee/eevee.c
@@ -26,6 +26,8 @@
 #include "DRW_render.h"
 
 #include "BLI_dynstr.h"
+#include "BLI_rand.h"
+#include "GPU_glew.h"
 
 #include "eevee.h"
 #include "eevee_private.h"
@@ -39,29 +41,162 @@ static struct {
 	struct GPUShader *depth_sh;
 	struct GPUShader *tonemap;
 	struct GPUShader *shadow_sh;
+	/* Temp : use world shader */
+	struct GPUShader *probe_sh;
+	struct GPUShader *probe_filter_sh;
+
 	struct GPUTexture *ltc_mat;
-	struct GPUTexture *ltc_mag;
+	struct GPUTexture *brdf_lut;
+	struct GPUTexture *hammersley;
+	struct GPUTexture *jitter;
 
 	float camera_pos[3];
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_ltc_lib_glsl[];
+extern char datatoc_bsdf_lut_frag_glsl[];
 extern char datatoc_bsdf_common_lib_glsl[];
 extern char datatoc_bsdf_direct_lib_glsl[];
+extern char datatoc_bsdf_sampling_lib_glsl[];
 extern char datatoc_lit_surface_frag_glsl[];
 extern char datatoc_lit_surface_vert_glsl[];
 extern char datatoc_tonemap_frag_glsl[];
 extern char datatoc_shadow_frag_glsl[];
 extern char datatoc_shadow_geom_glsl[];
 extern char datatoc_shadow_vert_glsl[];
+extern char datatoc_probe_filter_frag_glsl[];
+extern char datatoc_probe_frag_glsl[];
+extern char datatoc_probe_geom_glsl[];
+extern char datatoc_probe_vert_glsl[];
+
+/* Van der Corput sequence */
+ /* From http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html */
+static float radical_inverse(int i) {
+	unsigned int bits = (unsigned int)i;
+	bits = (bits << 16u) | (bits >> 16u);
+	bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
+	bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
+	bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
+	bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
+	return (float)bits * 2.3283064365386963e-10f;
+}
+
+static struct GPUTexture *create_hammersley_sample_texture(int samples)
+{
+	struct GPUTexture *tex;
+	float (*texels)[2] = MEM_mallocN(sizeof(float[2]) * samples, "hammersley_tex");
+	int i;
+
+	for (i = 0; i < samples; i++) {
+		float phi = radical_inverse(i) * 2.0f * M_PI;
+		texels[i][0] = cos(phi);
+		texels[i][1] = sinf(phi);
+	}
+
+	tex = DRW_texture_create_1D(samples, DRW_TEX_RG_16, DRW_TEX_WRAP, (float *)texels);
+	MEM_freeN(texels);
+	return tex;
+}
+
+static struct GPUTexture *create_jitter_texture(int w, int h)
+{
+	struct GPUTexture *tex;
+	float (*texels)[2] = MEM_mallocN(sizeof(float[2]) * w * h, "jitter_tex");
+	int i;
+
+	/* TODO replace by something more evenly distributed like blue noise */
+	for (i = 0; i < w * h; i++) {
+		texels[i][0] = 2.0f * BLI_frand() - 1.0f;
+		texels[i][1] = 2.0f * BLI_frand() - 1.0f;
+		normalize_v2(texels[i]);
+	}
+
+	tex = DRW_texture_create_2D(w, h, DRW_TEX_RG_16, DRW_TEX_WRAP, (float *)texels);
+	MEM_freeN(texels);
+	return tex;
+}
+
+static struct GPUTexture *create_ggx_lut_texture(int w, int h)
+{
+	struct GPUTexture *tex;
+#if 0 /* Used only to generate the LUT values */
+	struct GPUFrameBuffer *fb = NULL;
+	static float samples_ct = 8192.0f;
+	static float inv_samples_ct = 1.0f / 8192.0f;
+
+	char *lib_str = NULL;
+
+	DynStr *ds_vert = BLI_dynstr_new();
+	BLI_dynstr_append(ds_vert, datatoc_bsdf_common_lib_glsl);
+	BLI_dynstr_append(ds_vert, datatoc_bsdf_sampling_lib_glsl);
+	lib_str = BLI_dynstr_get_cstring(ds_vert);
+	BLI_dynstr_free(ds_vert);
+
+	struct GPUShader *sh = DRW_shader_create_with_lib(datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, datatoc_bsdf_lut_frag_glsl, lib_str,
+	                                                    "#define HAMMERSLEY_SIZE 8192\n"
+	                                                    "#define BRDF_LUT_SIZE 64\n"
+	                                                    "#define NOISE_SIZE 64\n");
+
+	DRWPass *pass = DRW_pass_create("Probe Filtering", DRW_STATE_WRITE_COLOR);
+	DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
+	DRW_shgroup_uniform_float(grp, "sampleCount", &samples_ct, 1);
+	DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_ct, 1);
+	DRW_shgroup_uniform_texture(grp, "texHammersley", e_data.hammersley, 0);
+	DRW_shgroup_uniform_texture(grp, "texJitter", e_data.jitter, 1);
+
+	struct Batch *geom = DRW_cache_fullscreen_quad_get();
+	DRW_shgroup_call_add(grp, geom, NULL);
+
+	float *texels = MEM_mallocN(sizeof(float[2]) * w * h, "lut");
+
+	tex = DRW_texture_create_2D(w, h, DRW_TEX_RG_16, DRW_TEX_FILTER, (float *)texels);
+
+	DRWFboTexture tex_filter = {&tex, DRW_BUF_RG_16, DRW_TEX_FILTER};
+	DRW_framebuffer_init(&fb, w, h, &tex_filter, 1);
+
+	DRW_framebuffer_bind(fb);
+	DRW_draw_pass(pass);
+
+	float *data = MEM_mallocN(sizeof(float[3]) * w * h, "lut");
+	glReadBuffer(GL_COLOR_ATTACHMENT0);
+	glReadPixels(0, 0, w, h, GL_RGB, GL_FLOAT, data);
+
+	printf("{");
+	for (int i = 0; i < w*h * 3; i+=3) {
+		printf("%ff, %ff, ", data[i],  data[i+1]); i+=3;
+		printf("%ff, %ff, ", data[i],  data[i+1]); i+=3;
+		printf("%ff, %ff, ", data[i],  data[i+1]); i+=3;
+		printf("%ff, %ff, \n", data[i],  data[i+1]);
+	}
+	printf("}");
+
+	MEM_freeN(texels);
+	MEM_freeN(data);
+#else
+	float (*texels)[3] = MEM_mallocN(sizeof(float[3]) * 64 * 64, "bsdf lut texels");
+
+	for (int i = 0; i < 64 * 64; i++) {
+		texels[i][0] = bsdf_split_sum_ggx[i*2 + 0];
+		texels[i][1] = bsdf_split_sum_ggx[i*2 + 1];
+		texels[i][2] = ltc_mag_ggx[i];
+	}
+
+	tex = DRW_texture_create_2D(64, 64, DRW_TEX_RGB_16, DRW_TEX_FILTER, (float *)texels);
+	MEM_freeN(texels);
+#endif
+
+	return tex;
+}
+
 
 /* *********** FUNCTIONS *********** */
 
-static void EEVEE_engine_init(void *vedata)
+static void EEVEE_engine_init(void *ved)
 {
-	EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl;
-	EEVEE_FramebufferList *fbl = ((EEVEE_Data *)vedata)->fbl;
-	EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
+	EEVEE_Data *vedata = (EEVEE_Data *)ved;
+	EEVEE_TextureList *txl = vedata->txl;
+	EEVEE_FramebufferList *fbl = vedata->fbl;
+	EEVEE_StorageList *stl = vedata->stl;
 
 	DRWFboTexture tex = {&txl->color, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
 
@@ -98,6 +233,26 @@ static void EEVEE_engine_init(void *vedata)
 		e_data.shadow_sh = DRW_shader_create(datatoc_shadow_vert_glsl, datatoc_shadow_geom_glsl, datatoc_shadow_frag_glsl, NULL);
 	}
 
+	if (!e_data.probe_sh) {
+		e_data.probe_sh = DRW_shader_create(datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, datatoc_probe_frag_glsl, NULL);
+	}
+
+	if (!e_data.probe_filter_sh) {
+		char *lib_str = NULL;
+
+		DynStr *ds_vert = BLI_dynstr_new();
+		BLI_dynstr_append(ds_vert, datatoc_bsdf_common_lib_glsl);
+		BLI_dynstr_append(ds_vert, datatoc_bsdf_sampling_lib_glsl);
+		lib_str = BLI_dynstr_get_cstring(ds_vert);
+		BLI_dynstr_free(ds_vert);
+
+		e_data.probe_filter_sh = DRW_shader_create_with_lib(datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, datatoc_probe_filter_frag_glsl, lib_str,
+		                                                    "#define HAMMERSLEY_SIZE 8192\n"
+		                                                    "#define NOISE_SIZE 64\n");
+
+		MEM_freeN(lib_str);
+	}
+
 	if (!e_data.tonemap) {
 		e_data.tonemap = DRW_shader_create_fullscreen(datatoc_tonemap_frag_glsl, NULL);
 	}
@@ -106,21 +261,40 @@ static void EEVEE_engine_init(void *vedata)
 		e_data.ltc_mat = DRW_texture_create_2D(64, 64, DRW_TEX_RGBA_16, DRW_TEX_FILTER, ltc_mat_ggx);
 	}
 
-	if (!e_data.ltc_mag) {
-		e_data.ltc_mag = DRW_texture_create_2D(64, 64, DRW_TEX_R_16, DRW_TEX_FILTER, ltc_mag_ggx);
+	if (!e_data.hammersley) {
+		e_data.hammersley = create_hammersley_sample_texture(8192);
 	}
 
-	if (stl->lamps == NULL) {
-		EEVEE_lights_init(stl);
+	if (!e_data.jitter) {
+		e_data.jitter = create_jitter_texture(64, 64);
+	}
+
+	if (!e_data.brdf_lut) {
+		e_data.brdf_lut = create_ggx_lut_texture(64, 64);
 	}
 
-	// EEVEE_lights_update(stl);
 	{
 		float viewinvmat[4][4];
 		DRW_viewport_matrix_get(viewinvmat, DRW_MAT_VIEWINV);
 
 		copy_v3_v3(e_data.camera_pos, viewinvmat[3]);
 	}
+
+	EEVEE_lights_init(stl);
+
+	EEVEE_probes_init(vedata);
+
+	// EEVEE_lights_update(stl);
+}
+
+static DRWShadingGroup *eevee_cube_shgroup(struct GPUShader *sh, DRWPass *pass, struct Batch *geom)
+{
+	DRWShadingGroup *grp = DRW_shgroup_instance_create(sh, pass, geom);
+
+	for (int i = 0; i < 6; ++i)
+		DRW_shgroup_dynamic_call_add(grp);
+
+	return grp;
 }
 
 static void EEVEE_cache_init(void *vedata)
@@ -135,7 +309,6 @@ static void EEVEE_cache_init(void *vedata)
 	}
 
 	{
-		/* Shadow Pass */
 		psl->shadow_pass = DRW_pass_create("Shadow Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
 		stl->g_data->shadow_shgrp = DRW_shg

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list