[Bf-blender-cvs] [d54c249] viewport_experiments: Separate SSAO pass - it's unlikely we'll be able to reuse this with depth of field in one pass, so better separate the shaders as well

Antony Riakiotakis noreply at git.blender.org
Thu Oct 23 22:43:04 CEST 2014


Commit: d54c249a7b5a4559a30db92644e89d7165049797
Author: Antony Riakiotakis
Date:   Thu Oct 23 22:42:48 2014 +0200
Branches: viewport_experiments
https://developer.blender.org/rBd54c249a7b5a4559a30db92644e89d7165049797

Separate SSAO pass - it's unlikely we'll be able to reuse this with
depth of field in one pass, so better separate the shaders as well

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

M	SConstruct
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/intern/gpu_compositing.c
M	source/blender/gpu/intern/gpu_extensions.c
D	source/blender/gpu/shaders/gpu_shader_fx_frag.glsl
A	source/blender/gpu/shaders/gpu_shader_fx_ssao_frag.glsl

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

diff --git a/SConstruct b/SConstruct
index 06171a4..c45dcf8 100644
--- a/SConstruct
+++ b/SConstruct
@@ -754,7 +754,7 @@ if B.targets != ['cudakernels']:
     data_to_c_simple("source/blender/gpu/shaders/gpu_shader_vertex.glsl")
     data_to_c_simple("source/blender/gpu/shaders/gpu_shader_vsm_store_frag.glsl")
     data_to_c_simple("source/blender/gpu/shaders/gpu_shader_vsm_store_vert.glsl")
-    data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_frag.glsl")
+    data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_ssao_frag.glsl")
     data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_vert.glsl")
     data_to_c_simple("intern/opencolorio/gpu_shader_display_transform.glsl")
 
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index fb5a2d0..7091ef9 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -57,7 +57,7 @@ set(SRC
 	intern/gpu_compositing.c
 	intern/gpu_renderer.c
 
-	shaders/gpu_shader_fx_frag.glsl
+	shaders/gpu_shader_fx_ssao_frag.glsl
 	shaders/gpu_shader_fx_vert.glsl
 	shaders/gpu_shader_material.glsl
 	shaders/gpu_shader_sep_gaussian_blur_frag.glsl
@@ -91,7 +91,7 @@ data_to_c_simple(shaders/gpu_shader_vertex.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_vsm_store_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_vsm_store_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_fx_vert.glsl SRC)
-data_to_c_simple(shaders/gpu_shader_fx_frag.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_fx_ssao_frag.glsl SRC)
 
 if(WITH_GAMEENGINE)
 	add_definitions(-DWITH_GAMEENGINE)
diff --git a/source/blender/gpu/intern/gpu_compositing.c b/source/blender/gpu/intern/gpu_compositing.c
index eb42cd2..a55f323 100644
--- a/source/blender/gpu/intern/gpu_compositing.c
+++ b/source/blender/gpu/intern/gpu_compositing.c
@@ -241,136 +241,138 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D *v3d, struct RegionView3D
 	glPopAttrib();
 	GPU_framebuffer_restore();
 	
+
+	/* set up quad buffer */
+	glVertexPointer(2, GL_FLOAT, 0, fullscreencos);
+	glTexCoordPointer(2, GL_FLOAT, 0, fullscreenuvs);
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+
 	/* full screen FX pass */
 	
-	/* first we need to blur the color pass */
-	
-	
-	/* set up the shader */
-	fx_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD);
-	if (fx_shader) {
-		/* view vectors for the corners of the view frustum. Can be used to recreate the world space position easily */
-		float ssao_viewvecs[3][4] = {
-		    {-1.0f, -1.0f, -1.0f, 1.0f},
-		    {1.0f, -1.0f, -1.0f, 1.0f},
-		    {-1.0f, 1.0f, -1.0f, 1.0f}
-		};
-		int i;
-		int screendim_uniform, color_uniform, depth_uniform, dof_uniform, blurred_uniform;
-		int ssao_uniform, ssao_color_uniform, ssao_viewvecs_uniform, ssao_sample_params_uniform;
-		int ssao_jitter_uniform, ssao_direction_uniform;
-		float fac = v3d->dof_fstop * v3d->dof_aperture;
-		float dof_params[2] = {v3d->dof_aperture * fabs(fac / (v3d->dof_focal_distance - fac)), 
-							   v3d->dof_focal_distance};
-		float ssao_params[4] = {v3d->ssao_distance_max, v3d->ssao_darkening, v3d->ssao_attenuation, 0.0f};
-		float screen_dim[2] = {fx->gbuffer_dim[0], fx->gbuffer_dim[1]};
-		float sample_params[4];
-
-		float invproj[4][4];
-
-		if (!init)
-			create_sample_directions();
-
-		/* invert the view matrix */
-		invert_m4_m4(invproj, rv3d->winmat);
-
-		/* convert the view vectors to view space */
-		for (i = 0; i < 3; i++) {
-			mul_m4_v4(invproj, ssao_viewvecs[i]);
-			/* normalized trick see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
-			mul_v3_fl(ssao_viewvecs[i], 1.0f / ssao_viewvecs[i][3]);
-			mul_v3_fl(ssao_viewvecs[i], 1.0f / ssao_viewvecs[i][2]);
-			ssao_viewvecs[i][2] = 1.0;
-		}
-
-		/* we need to store the differences */
-		ssao_viewvecs[1][0] -= ssao_viewvecs[0][0];
-		ssao_viewvecs[1][1] = ssao_viewvecs[2][1] - ssao_viewvecs[0][1];
-
-		switch (v3d->ssao_ray_sample_mode) {
-			case 0:
-				sample_params[0] = 4;
-				sample_params[1] = 4;
-				break;
-			case 1:
-				sample_params[0] = 8;
-				sample_params[1] = 5;
-				break;
-			case 2:
-				sample_params[0] = 16;
-				sample_params[1] = 10;
-				break;
+	/* ssao pass */
+	if (fx->effects & V3D_FX_SSAO) {
+		fx_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD);
+		if (fx_shader) {
+			/* view vectors for the corners of the view frustum. Can be used to recreate the world space position easily */
+			float ssao_viewvecs[3][4] = {
+			    {-1.0f, -1.0f, -1.0f, 1.0f},
+			    {1.0f, -1.0f, -1.0f, 1.0f},
+			    {-1.0f, 1.0f, -1.0f, 1.0f}
+			};
+			int i;
+			int screendim_uniform, color_uniform, depth_uniform, dof_uniform, blurred_uniform;
+			int ssao_uniform, ssao_color_uniform, ssao_viewvecs_uniform, ssao_sample_params_uniform;
+			int ssao_jitter_uniform, ssao_direction_uniform;
+			float fac = v3d->dof_fstop * v3d->dof_aperture;
+			float dof_params[2] = {v3d->dof_aperture * fabs(fac / (v3d->dof_focal_distance - fac)),
+			                       v3d->dof_focal_distance};
+			float ssao_params[4] = {v3d->ssao_distance_max, v3d->ssao_darkening, v3d->ssao_attenuation, 0.0f};
+			float screen_dim[2] = {fx->gbuffer_dim[0], fx->gbuffer_dim[1]};
+			float sample_params[4];
+
+			float invproj[4][4];
+
+			if (!init)
+				create_sample_directions();
+
+			/* invert the view matrix */
+			invert_m4_m4(invproj, rv3d->winmat);
+
+			/* convert the view vectors to view space */
+			for (i = 0; i < 3; i++) {
+				mul_m4_v4(invproj, ssao_viewvecs[i]);
+				/* normalized trick see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer */
+				mul_v3_fl(ssao_viewvecs[i], 1.0f / ssao_viewvecs[i][3]);
+				mul_v3_fl(ssao_viewvecs[i], 1.0f / ssao_viewvecs[i][2]);
+				ssao_viewvecs[i][2] = 1.0;
+			}
+
+			/* we need to store the differences */
+			ssao_viewvecs[1][0] -= ssao_viewvecs[0][0];
+			ssao_viewvecs[1][1] = ssao_viewvecs[2][1] - ssao_viewvecs[0][1];
+
+			switch (v3d->ssao_ray_sample_mode) {
+				case 0:
+					sample_params[0] = 4;
+					sample_params[1] = 4;
+					break;
+				case 1:
+					sample_params[0] = 8;
+					sample_params[1] = 5;
+					break;
+				case 2:
+					sample_params[0] = 16;
+					sample_params[1] = 10;
+					break;
+			}
+
+			/* multiplier so we tile the random texture on screen */
+			sample_params[2] = fx->gbuffer_dim[0] / 64.0;
+			sample_params[3] = fx->gbuffer_dim[1] / 64.0;
+
+			dof_uniform = GPU_shader_get_uniform(fx_shader, "dof_params");
+			blurred_uniform = GPU_shader_get_uniform(fx_shader, "blurredcolorbuffer");
+			screendim_uniform = GPU_shader_get_uniform(fx_shader, "screendim");
+
+			ssao_uniform = GPU_shader_get_uniform(fx_shader, "ssao_params");
+			ssao_color_uniform = GPU_shader_get_uniform(fx_shader, "ssao_color");
+			color_uniform = GPU_shader_get_uniform(fx_shader, "colorbuffer");
+			depth_uniform = GPU_shader_get_uniform(fx_shader, "depthbuffer");
+			ssao_viewvecs_uniform = GPU_shader_get_uniform(fx_shader, "ssao_viewvecs");
+			ssao_sample_params_uniform = GPU_shader_get_uniform(fx_shader, "ssao_sample_params");
+			ssao_jitter_uniform = GPU_shader_get_uniform(fx_shader, "jitter_tex");
+			ssao_direction_uniform = GPU_shader_get_uniform(fx_shader, "sample_directions");
+
+			GPU_shader_bind(fx_shader);
+
+			GPU_shader_uniform_vector(fx_shader, screendim_uniform, 2, 1, screen_dim);
+			GPU_shader_uniform_vector(fx_shader, dof_uniform, 2, 1, dof_params);
+			GPU_shader_uniform_vector(fx_shader, ssao_uniform, 4, 1, ssao_params);
+			GPU_shader_uniform_vector(fx_shader, ssao_color_uniform, 4, 1, v3d->ssao_color);
+			GPU_shader_uniform_vector(fx_shader, ssao_viewvecs_uniform, 4, 3, ssao_viewvecs[0]);
+			GPU_shader_uniform_vector(fx_shader, ssao_sample_params_uniform, 4, 1, sample_params);
+			GPU_shader_uniform_vector(fx_shader, ssao_direction_uniform, 2, 16, ssao_sample_directions[0]);
+
+			GPU_texture_bind(fx->color_buffer, numslots++);
+			GPU_shader_uniform_texture(fx_shader, blurred_uniform, fx->color_buffer);
+			/* generate mipmaps for the color buffer */
+			//		glGenerateMipmapEXT(GL_TEXTURE_2D);
+			//		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+			//		glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, 2.0);
+
+			GPU_texture_bind(fx->color_buffer, numslots++);
+			GPU_shader_uniform_texture(fx_shader, color_uniform, fx->color_buffer);
+
+			GPU_texture_bind(fx->depth_buffer, numslots++);
+			GPU_depth_texture_mode(fx->depth_buffer, false, true);
+			GPU_shader_uniform_texture(fx_shader, depth_uniform, fx->depth_buffer);
+
+			GPU_texture_bind(fx->jitter_buffer, numslots++);
+			GPU_shader_uniform_texture(fx_shader, ssao_jitter_uniform, fx->jitter_buffer);
 		}
 
-		/* multiplier so we tile the random texture on screen */
-		sample_params[2] = fx->gbuffer_dim[0] / 64.0;
-		sample_params[3] = fx->gbuffer_dim[1] / 64.0;
+		/* set invalid color in case shader fails */
+		glColor3f(1.0, 0.0, 1.0);
 
-		dof_uniform = GPU_shader_get_uniform(fx_shader, "dof_params");
-		blurred_uniform = GPU_shader_get_uniform(fx_shader, "blurredcolorbuffer");
-		screendim_uniform = GPU_shader_get_uniform(fx_shader, "screendim");
+		/* draw */
+		glDisable(GL_DEPTH_TEST);
+		glDrawArrays(GL_QUADS, 0, 4);
 
-		ssao_uniform = GPU_shader_get_uniform(fx_shader, "ssao_params");
-		ssao_color_uniform = GPU_shader_get_uniform(fx_shader, "ssao_color");
-		color_uniform = GPU_shader_get_uniform(fx_shader, "colorbuffer");
-		depth_uniform = GPU_shader_get_uniform(fx_shader, "depthbuffer");
-		ssao_viewvecs_uniform = GPU_shader_get_uniform(fx_shader, "ssao_viewvecs");
-		ssao_sample_params_uniform = GPU_shader_get_uniform(fx_shader, "ssao_sample_params");
-		ssao_jitter_uniform = GPU_shader_get_uniform(fx_shader, "jitter_tex");
-		ssao_direction_uniform = GPU_shader_get_uniform(fx_shader, "sample_directions");
+		/* disable bindings */
+		GPU_texture_unbind(fx->color_buffer);
+		GPU_depth_texture_mode(fx->depth_buffer, true, false);
+		GPU_texture_unbind(fx->depth_buffer);
 
-		GPU_shader_bind(fx_shader);
-		
-		GPU_shader_uniform_vector(fx_shader, screendim_uniform, 2, 1, screen_dim);
-		GPU_shader_uni

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list