Commit: 79b8540e66b86b0f66ddd1edb9bb36867ed86fa1
Author: Antony Riakiotakis
Date: Tue Jan 6 17:57:25 2015 +0100
Branches: viewport_experiments
https://developer.blender.org/rB79b8540e66b86b0f66ddd1edb9bb36867ed86fa1
First stage of better dof, downsample buffer by half.
===================================================================
M source/blender/gpu/intern/gpu_compositing.c
M source/blender/gpu/shaders/gpu_shader_fx_dof_high_frag.glsl
M source/blender/gpu/shaders/gpu_shader_fx_dof_high_vert.glsl
M source/blender/gpu/shaders/gpu_shader_fx_lib.glsl
===================================================================
diff --git a/source/blender/gpu/intern/gpu_compositing.c
b/source/blender/gpu/intern/gpu_compositing.c
index d46cff4..13596a2 100644
--- a/source/blender/gpu/intern/gpu_compositing.c
+++ b/source/blender/gpu/intern/gpu_compositing.c
@@ -264,7 +264,7 @@ bool GPU_initialize_fx_passes(GPUFX *fx, rcti *rect, rcti
*scissor_rect, int fxf
/* disable effects if no options passed for them */
if (!options->dof_options || (options->dof_options->dof_quality_mode
== DOF_QUALITY_HIGH)) {
- fxflags &= ~GPU_FX_DEPTH_OF_FIELD;
+ //fxflags &= ~GPU_FX_DEPTH_OF_FIELD;
}
if (!options->ssao_options || options->ssao_options->ssao_num_samples <
1) {
fxflags &= ~GPU_FX_SSAO;
@@ -637,7 +637,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float
projmat[4][4], bool is_persp, str
dof_shader_pass5 =
GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD_PASS_FIVE,
is_persp);
/* error occured, restore framebuffers and return */
- if (!dof_shader_pass1 || !dof_shader_pass2 ||
!dof_shader_pass3 || !dof_shader_pass4 || !dof_shader_pass5) {
+ if (!(dof_shader_pass1 && dof_shader_pass2 &&
dof_shader_pass3 && dof_shader_pass4 && dof_shader_pass5)) {
GPU_framebuffer_texture_unbind(fx->gbuffer,
NULL);
GPU_framebuffer_restore();
return false;
@@ -880,23 +880,119 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float
projmat[4][4], bool is_persp, str
}
/* high quality diffusion solver */
else {
- GPUShader *dof_shader_pass1, *dof_shader_pass2,
*dof_shader_pass3, *dof_shader_pass4;
+ GPUShader *dof_shader_pass1, *dof_shader_pass2;//,
*dof_shader_pass3, *dof_shader_pass4;
- /* DOF effect has many passes but most of them are
performed on a texture whose dimensions are 4 times less than the original
- * (16 times lower than original screen resolution).
Technique used is not very exact but should be fast enough and is based
- * on "Practical Post-Process Depth of Field" see
http://http.developer.nvidia.com/GPUGems3/gpugems3_ch28.html */
dof_shader_pass1 =
GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD_DOWNSAMPLE_HALF,
is_persp);
dof_shader_pass2 =
GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD_DOWNSAMPLE_HALF_COC,
is_persp);
- dof_shader_pass3 =
GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD_PASS_THREE,
is_persp);
- dof_shader_pass4 =
GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD_PASS_FOUR,
is_persp);
+ //dof_shader_pass3 =
GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD_BLUR, is_persp);
+ //dof_shader_pass4 =
GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD_FINAL_COMBINE,
is_persp);
/* error occured, restore framebuffers and return */
- if (!dof_shader_pass1) {
+ if (!(dof_shader_pass1 && dof_shader_pass2)) {
GPU_framebuffer_texture_unbind(fx->gbuffer,
NULL);
GPU_framebuffer_restore();
return false;
}
+
+ /* downsample pass */
+ {
+ int invrendertargetdim_uniform, color_uniform,
depth_uniform, dof_uniform;
+ int viewvecs_uniform;
+
+ float invrendertargetdim[2] = {1.0f /
fx->gbuffer_dim[0], 1.0f / fx->gbuffer_dim[1]};
+
+ dof_uniform =
GPU_shader_get_uniform(dof_shader_pass1, "dof_params");
+ invrendertargetdim_uniform =
GPU_shader_get_uniform(dof_shader_pass1, "invrendertargetdim");
+ color_uniform =
GPU_shader_get_uniform(dof_shader_pass1, "colorbuffer");
+ depth_uniform =
GPU_shader_get_uniform(dof_shader_pass1, "depthbuffer");
+ viewvecs_uniform =
GPU_shader_get_uniform(dof_shader_pass1, "viewvecs");
+
+ GPU_shader_bind(dof_shader_pass1);
+
+ GPU_shader_uniform_vector(dof_shader_pass1,
dof_uniform, 4, 1, dof_params);
+ GPU_shader_uniform_vector(dof_shader_pass1,
invrendertargetdim_uniform, 2, 1, invrendertargetdim);
+ GPU_shader_uniform_vector(dof_shader_pass1,
viewvecs_uniform, 4, 3, viewvecs[0]);
+
+ GPU_texture_bind(src, numslots++);
+ GPU_shader_uniform_texture(dof_shader_pass1,
color_uniform, src);
+
+ GPU_texture_bind(fx->depth_buffer, numslots++);
+ GPU_depth_texture_mode(fx->depth_buffer, false,
true);
+ GPU_shader_uniform_texture(dof_shader_pass1,
depth_uniform, fx->depth_buffer);
+
+ /* target is the downsampled coc buffer */
+ GPU_framebuffer_texture_attach(fx->gbuffer,
fx->dof_half_downsampled, 0, NULL);
+ /* binding takes care of setting the viewport
to the downsampled size */
+
GPU_texture_bind_as_framebuffer(fx->dof_half_downsampled);
+
+ glDisable(GL_DEPTH_TEST);
+ glDrawArrays(GL_QUADS, 0, 4);
+ /* disable bindings */
+ GPU_texture_unbind(src);
+ GPU_depth_texture_mode(fx->depth_buffer, true,
false);
+ GPU_texture_unbind(fx->depth_buffer);
+
+ GPU_framebuffer_texture_unbind(fx->gbuffer,
fx->dof_half_downsampled);
+
GPU_framebuffer_texture_detach(fx->dof_half_downsampled);
+ numslots = 0;
+
+ }
+
+ /* final pass, merge blurred layers according to final
calculated coc */
+ {
+ int half_downsampled_uniform, nearfar_uniform;
+
+ GPU_shader_bind(dof_shader_pass2);
+ //GPU_shader_uniform_vector(dof_shader_pass2,
dof_uniform, 4, 1, dof_params);
+ //GPU_shader_uniform_vector(dof_shader_pass2,
invrendertargetdim_uniform, 2, 1, invrendertargetdim);
+ //GPU_shader_uniform_vector(dof_shader_pass2,
viewvecs_uniform, 4, 3, viewvecs[0]);
+
+ //GPU_texture_bind(src, numslots++);
+ //GPU_shader_uniform_texture(dof_shader_pass5,
original_uniform, src);
+
+ half_downsampled_uniform =
GPU_shader_get_uniform(dof_shader_pass2, "colorbuffer");
+ nearfar_uniform =
GPU_shader_get_uniform(dof_shader_pass2, "cocbuffer");
+
+ GPU_texture_bind(fx->dof_half_downsampled,
numslots++);
+ GPU_shader_uniform_texture(dof_shader_pass2,
half_downsampled_uniform, fx->dof_half_downsampled);
+
+ GPU_texture_bind(fx->dof_nearfar_coc[0],
numslots++);
+ GPU_shader_uniform_texture(dof_shader_pass2,
nearfar_uniform, fx->dof_nearfar_coc[0]);
+
+ /* if this is the last pass, prepare for
rendering on the frambuffer */
+ if (passes_left-- == 1) {
+
GPU_framebuffer_texture_unbind(fx->gbuffer, NULL);
+ if (ofs) {
+ GPU_offscreen_bind(ofs, false);
+ }
+ else
+ GPU_framebuffer_restore();
+ }
+ else {
+ /* bind the ping buffer to the color
buffer */
+
GPU_framebuffer_texture_attach(fx->gbuffer, target, 0, NULL);
+ }
+ glDisable(GL_DEPTH_TEST);
+ glDrawArrays(GL_QUADS, 0, 4);
+ /* disable bindings */
+ GPU_texture_unbind(fx->dof_half_downsampled);
+ GPU_texture_unbind(fx->dof_nearfar_coc[0]);
+
+ /* may not be attached, in that case this just
returns */
+ if (target) {
+ GPU_framebuffer_texture_detach(target);
+ if (ofs) {
+ GPU_offscreen_bind(ofs, false);
+ }
+ else {
+ GPU_framebuffer_restore();
+ }
+ }
+
+ SWAP(GPUTexture *, target, src);
+ numslots = 0;
+ }
}
}
diff --git a/source/blender/gpu/shaders/gpu_shader_fx_dof_high_frag.glsl
b/source/blender/gpu/shaders/gpu_shader_fx_dof_high_frag.glsl
index 66e2271..277c028 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_dof_high_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_fx_dof_high_frag.glsl
@@ -11,6 +11,8 @@ varying vec2 depth_uv4;
uniform sampler2D colorbuffer;
// depth buffer
uniform sampler2D depthbuffer;
+// circle of confusion buffer
+uniform sampler2D cocbuffer;
// this includes focal distance in x and aperture size in y
uniform vec4 dof_params;
@@ -24,9 +26,9 @@ float calculate_signed_coc(in float zdepth)
return coc * dof_params.z;
}
-void half_downsample_frag()
+void half_downsample_frag(void)
{
- vec4 depthv, final_coc;
+ vec4 depthv;
depthv.r = calculate_signed_coc(texture2D(depthbuffer, depth_uv1).r);
depthv.g = calculate_signed_coc(texture2D(depthbuffer, depth_uv2).r);
depthv.b = calculate_signed_coc(texture2D(depthbuffer, depth_uv3).r);
@@ -39,7 +41,13 @@ void half_downsample_frag()
gl_FragData[1].b = gl_FragData[1].a = 0.0;
/* framebuffer output 1 is bound to half size color. linear filtering
should take care of averaging here */
- gl_FragData[0] = texture2D(colorbuffer, uvcoordsvar);
+ gl_FragData[0] = texture2D(colorbuffer, uvcoordsvar.xy);
+}
+
+void final_combine_frag(void)
+{
+ /* framebuffer output 1 is bound to half size color. linear filtering
should take care of averaging here */
+ gl_FragColor = texture2D(colorbuffer, uvcoordsvar.xy);
}
void main(void)
@@ -47,7 +55,6 @@ void main(void)
#ifdef HALF_DOWNSAMPLE_PASS
half_downsample_frag();
#elif defined(HALF_DOWNSAMPLE_COC_PASS)
-
+ final_combine_frag();
#endif
-
}
diff --git a/source/blender/gpu/shaders/gpu_shader_fx_dof_high_vert.glsl
b/source/blender/gpu/shaders/gpu_shader_fx_dof_high_vert.glsl
index 3231a5c..ffc1733 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_dof_high_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_fx_dof_high_vert.glsl
@@ -13,18 +13,23 @@ void vert_half_downsample(void)
uvcoordsvar = gl_MultiTexCoord0;
gl_Position = gl_Vertex;
- depth_uv1 = gl_MultiTexCoord0.xy + vec2(-0.5, -0.5) *
invrendertargetdim;
- depth_uv2 = gl_MultiTexCoord0.xy + vec2(-0.5, 0.5) * invrendertargetdim;
- depth_uv3 = gl_MultiTexCoord0.xy + vec2(0.5, -0.5) * invrendertargetdim;
- depth_uv4 = gl_MultiTexCoord0.xy + vec2(0.5, 0.5) * invrendertargetdim;
+ depth_uv1 = gl_MultiTexCoord0.xy + vec2(0.0, 0.0) * invrendertargetdim;
+ depth_uv2 = gl_MultiTexCoord0.xy + vec2(0.0, 1.0) * invrendertargetdim;
+ depth_uv3 = gl_MultiTexCoord0.xy + vec2(1.0, 0.0) * invrendertargetdim;
+ depth_uv4 = gl_MultiTexCoord0.xy + vec2(1.0, 1.0) * invrendertargetdim;
}
+void vert_final_combine(void)
+{
+ uvcoordsvar = gl_MultiTexCoord0;
+ gl_Position = gl_Vertex;
+}
void main(void)
{
#ifdef HALF_DOWNSAMPLE_PASS
vert_half_downsample();
#elif defined(HALF_DOWNSAMPLE_COC_PASS)
-
+ vert_final_combine();
#endif
}
diff --git a/source/blender/gpu/shaders/gpu_shader_fx_lib.glsl
b/source/blender/gpu/shaders/gpu_shader_fx_lib.glsl
index a138d2e..6c4bf3b 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_lib.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_fx_lib.glsl
@@ -44,4 +44,4 @@ vec4 get_view_space_z_from_depth(in vec4 near, in vec4 range,
in vec4 depth)
return -(near + depth * rang
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs