[Bf-blender-cvs] [e5799d1389] blender2.8: OpenGL immediate mode: gpu_framebuffer.c

Clément Foucault noreply at git.blender.org
Fri Feb 24 01:29:01 CET 2017


Commit: e5799d13897e43410758af4fcef9e1e71a25e719
Author: Clément Foucault
Date:   Wed Feb 22 19:57:58 2017 +0100
Branches: blender2.8
https://developer.blender.org/rBe5799d13897e43410758af4fcef9e1e71a25e719

OpenGL immediate mode: gpu_framebuffer.c

I had to make some changes to the sep_gaussian_blur shader to be compliant for gl 3.3 leap

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

M	source/blender/gpu/gawain/batch.c
M	source/blender/gpu/gawain/batch.h
M	source/blender/gpu/intern/gpu_framebuffer.c
M	source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_frag.glsl
M	source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_vert.glsl

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

diff --git a/source/blender/gpu/gawain/batch.c b/source/blender/gpu/gawain/batch.c
index 81e694cc9b..a40e801d48 100644
--- a/source/blender/gpu/gawain/batch.c
+++ b/source/blender/gpu/gawain/batch.c
@@ -133,6 +133,17 @@ void Batch_done_using_program(Batch* batch)
 		}
 	}
 
+void Batch_Uniform1i(Batch* batch, const char* name, int value)
+	{
+	int loc = glGetUniformLocation(batch->program, name);
+
+#if TRUST_NO_ONE
+	assert(loc != -1);
+#endif
+
+	glUniform1i(loc, value);
+	}
+
 void Batch_Uniform1b(Batch* batch, const char* name, bool value)
 	{
 	int loc = glGetUniformLocation(batch->program, name);
diff --git a/source/blender/gpu/gawain/batch.h b/source/blender/gpu/gawain/batch.h
index 660ed9eb76..c12cc4e66a 100644
--- a/source/blender/gpu/gawain/batch.h
+++ b/source/blender/gpu/gawain/batch.h
@@ -50,6 +50,7 @@ void Batch_set_program(Batch*, GLuint program);
 void Batch_use_program(Batch*); // call before Batch_Uniform (temp hack?)
 void Batch_done_using_program(Batch*);
 
+void Batch_Uniform1i(Batch*, const char* name, int value);
 void Batch_Uniform1b(Batch*, const char* name, bool value);
 void Batch_Uniform1f(Batch*, const char* name, float value);
 void Batch_Uniform2f(Batch*, const char* name, float x, float y);
diff --git a/source/blender/gpu/intern/gpu_framebuffer.c b/source/blender/gpu/intern/gpu_framebuffer.c
index 3b44abb479..eb52825e02 100644
--- a/source/blender/gpu/intern/gpu_framebuffer.c
+++ b/source/blender/gpu/intern/gpu_framebuffer.c
@@ -32,9 +32,11 @@
 
 #include "BKE_global.h"
 
+#include "GPU_batch.h"
 #include "GPU_debug.h"
 #include "GPU_glew.h"
 #include "GPU_framebuffer.h"
+#include "GPU_matrix.h"
 #include "GPU_shader.h"
 #include "GPU_texture.h"
 
@@ -379,20 +381,48 @@ void GPU_framebuffer_blur(
         GPUFrameBuffer *fb, GPUTexture *tex,
         GPUFrameBuffer *blurfb, GPUTexture *blurtex)
 {
+	const float fullscreencos[4][2] = {{-1.0f, -1.0f}, {1.0f, -1.0f}, {-1.0f, 1.0f}, {1.0f, 1.0f}};
+	const float fullscreenuvs[4][2] = {{0.0f, 0.0f}, {1.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}};
+
+	static VertexFormat format = {0};
+	static VertexBuffer vbo = {0};
+	static Batch batch = {0};
+
 	const float scaleh[2] = {1.0f / GPU_texture_width(blurtex), 0.0f};
 	const float scalev[2] = {0.0f, 1.0f / GPU_texture_height(tex)};
 
 	GPUShader *blur_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SEP_GAUSSIAN_BLUR);
-	int scale_uniform, texture_source_uniform;
 
 	if (!blur_shader)
 		return;
 
-	scale_uniform = GPU_shader_get_uniform(blur_shader, "ScaleU");
-	texture_source_uniform = GPU_shader_get_uniform(blur_shader, "textureSource");
+	/* Preparing to draw quad */
+	if (format.attrib_ct == 0) {
+		unsigned int i = 0;
+		/* Vertex format */
+		unsigned int pos = add_attrib(&format, "pos", GL_FLOAT, 2, KEEP_FLOAT);
+		unsigned int uvs = add_attrib(&format, "uvs", GL_FLOAT, 2, KEEP_FLOAT);
+
+		/* Vertices */
+		VertexBuffer_init_with_format(&vbo, &format);
+		VertexBuffer_allocate_data(&vbo, 36);
+
+		for (int j = 0; j < 3; ++j) {
+			setAttrib(&vbo, uvs, i, fullscreenuvs[j]); setAttrib(&vbo, pos, i++, fullscreencos[j]);
+		}
+		for (int j = 1; j < 4; ++j) {
+			setAttrib(&vbo, uvs, i, fullscreenuvs[j]); setAttrib(&vbo, pos, i++, fullscreencos[j]);
+		}
+
+		Batch_init(&batch, GL_TRIANGLES, &vbo, NULL);
+	}
 		
-	/* Blurring horizontally */
+	glDisable(GL_DEPTH_TEST);
+	
+	/* Load fresh matrices */
+	gpuMatrixBegin3D(); /* TODO: finish 2D API */
 
+	/* Blurring horizontally */
 	/* We do the bind ourselves rather than using GPU_framebuffer_texture_bind() to avoid
 	 * pushing unnecessary matrices onto the OpenGL stack. */
 	glBindFramebuffer(GL_FRAMEBUFFER, blurfb->object);
@@ -401,51 +431,32 @@ void GPU_framebuffer_blur(
 	/* avoid warnings from texture binding */
 	GG.currentfb = blurfb->object;
 
-	GPU_shader_bind(blur_shader);
-	GPU_shader_uniform_vector(blur_shader, scale_uniform, 2, 1, scaleh);
-	GPU_shader_uniform_texture(blur_shader, texture_source_uniform, tex);
 	glViewport(0, 0, GPU_texture_width(blurtex), GPU_texture_height(blurtex));
 
-	/* Preparing to draw quad */
-	glMatrixMode(GL_TEXTURE);
-	glLoadIdentity();
-	glMatrixMode(GL_PROJECTION);
-	glLoadIdentity();
-	glMatrixMode(GL_MODELVIEW);
-	glLoadIdentity();
-
-	glDisable(GL_DEPTH_TEST);
-
 	GPU_texture_bind(tex, 0);
 
-	/* Drawing quad */
-	glBegin(GL_QUADS);
-	glTexCoord2d(0, 0); glVertex2f(1, 1);
-	glTexCoord2d(1, 0); glVertex2f(-1, 1);
-	glTexCoord2d(1, 1); glVertex2f(-1, -1);
-	glTexCoord2d(0, 1); glVertex2f(1, -1);
-	glEnd();
+	Batch_set_builtin_program(&batch, GPU_SHADER_SEP_GAUSSIAN_BLUR);
+	Batch_Uniform2f(&batch, "ScaleU", scaleh[0], scaleh[1]);
+	Batch_Uniform1i(&batch, "textureSource", GL_TEXTURE0);
+	Batch_draw(&batch);
 
 	/* Blurring vertically */
-
 	glBindFramebuffer(GL_FRAMEBUFFER, fb->object);
 	glDrawBuffer(GL_COLOR_ATTACHMENT0);
 	
 	GG.currentfb = fb->object;
 	
 	glViewport(0, 0, GPU_texture_width(tex), GPU_texture_height(tex));
-	GPU_shader_uniform_vector(blur_shader, scale_uniform, 2, 1, scalev);
-	GPU_shader_uniform_texture(blur_shader, texture_source_uniform, blurtex);
+
 	GPU_texture_bind(blurtex, 0);
 
-	glBegin(GL_QUADS);
-	glTexCoord2d(0, 0); glVertex2f(1, 1);
-	glTexCoord2d(1, 0); glVertex2f(-1, 1);
-	glTexCoord2d(1, 1); glVertex2f(-1, -1);
-	glTexCoord2d(0, 1); glVertex2f(1, -1);
-	glEnd();
+	/* Hack to make the following uniform stick */
+	Batch_set_builtin_program(&batch, GPU_SHADER_SEP_GAUSSIAN_BLUR);
+	Batch_Uniform2f(&batch, "ScaleU", scalev[0], scalev[1]);
+	Batch_Uniform1i(&batch, "textureSource", GL_TEXTURE0);
+	Batch_draw(&batch);
 
-	GPU_shader_unbind();
+	gpuMatrixEnd();
 }
 
 void GPU_framebuffer_blit(GPUFrameBuffer *fb_read, int read_slot, GPUFrameBuffer *fb_write, int write_slot, bool use_depth)
diff --git a/source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_frag.glsl b/source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_frag.glsl
index b485d2cce8..d7cdec9441 100644
--- a/source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_frag.glsl
@@ -1,16 +1,25 @@
 uniform vec2 ScaleU;
 uniform sampler2D textureSource;
 
+#if __VERSION__ == 120
+  varying vec2 texCoord_interp;
+  #define fragColor gl_FragColor
+#else
+  in vec2 texCoord_interp;
+  out vec4 fragColor;
+  #define texture2D texture
+#endif
+
 void main()
 {
 	vec4 color = vec4(0.0);
-	color += texture2D(textureSource, gl_TexCoord[0].st + vec2(-3.0 * ScaleU.x, -3.0 * ScaleU.y)) * 0.015625;
-	color += texture2D(textureSource, gl_TexCoord[0].st + vec2(-2.0 * ScaleU.x, -2.0 * ScaleU.y)) * 0.09375;
-	color += texture2D(textureSource, gl_TexCoord[0].st + vec2(-1.0 * ScaleU.x, -1.0 * ScaleU.y)) * 0.234375;
-	color += texture2D(textureSource, gl_TexCoord[0].st + vec2(0.0, 0.0)) * 0.3125;
-	color += texture2D(textureSource, gl_TexCoord[0].st + vec2(1.0 * ScaleU.x,  1.0 * ScaleU.y)) * 0.234375;
-	color += texture2D(textureSource, gl_TexCoord[0].st + vec2(2.0 * ScaleU.x,  2.0 * ScaleU.y)) * 0.09375;
-	color += texture2D(textureSource, gl_TexCoord[0].st + vec2(3.0 * ScaleU.x,  3.0 * ScaleU.y)) * 0.015625;
+	color += texture2D(textureSource, texCoord_interp.st + vec2(-3.0 * ScaleU.x, -3.0 * ScaleU.y)) * 0.015625;
+	color += texture2D(textureSource, texCoord_interp.st + vec2(-2.0 * ScaleU.x, -2.0 * ScaleU.y)) * 0.09375;
+	color += texture2D(textureSource, texCoord_interp.st + vec2(-1.0 * ScaleU.x, -1.0 * ScaleU.y)) * 0.234375;
+	color += texture2D(textureSource, texCoord_interp.st + vec2(0.0, 0.0)) * 0.3125;
+	color += texture2D(textureSource, texCoord_interp.st + vec2(1.0 * ScaleU.x,  1.0 * ScaleU.y)) * 0.234375;
+	color += texture2D(textureSource, texCoord_interp.st + vec2(2.0 * ScaleU.x,  2.0 * ScaleU.y)) * 0.09375;
+	color += texture2D(textureSource, texCoord_interp.st + vec2(3.0 * ScaleU.x,  3.0 * ScaleU.y)) * 0.015625;
 
-	gl_FragColor = color;
+	fragColor = color;
 }
diff --git a/source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_vert.glsl b/source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_vert.glsl
index 5d00108b05..a0e5b022e6 100644
--- a/source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_vert.glsl
@@ -1,6 +1,18 @@
 
+uniform mat4 ModelViewProjectionMatrix;
+
+#if __VERSION__ == 120
+  attribute vec2 pos;
+  attribute vec2 uvs;
+  varying vec2 texCoord_interp;
+#else
+  in vec2 pos;
+  in vec2 uvs;
+  out vec2 texCoord_interp;
+#endif
+
 void main()
 {
-	gl_Position = ftransform();
-	gl_TexCoord[0] = gl_MultiTexCoord0;
+	gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
+	texCoord_interp = uvs;
 }




More information about the Bf-blender-cvs mailing list