[Bf-blender-cvs] [5efa0e0] viewport_experiments: Add separate file for DOF effect and cleanup the parameter passing a little.
Antony Riakiotakis
noreply at git.blender.org
Mon Oct 27 10:07:42 CET 2014
Commit: 5efa0e03b52175163bb58353df304c40bd769c70
Author: Antony Riakiotakis
Date: Sun Oct 26 15:43:46 2014 +0100
Branches: viewport_experiments
https://developer.blender.org/rB5efa0e03b52175163bb58353df304c40bd769c70
Add separate file for DOF effect and cleanup the parameter passing a little.
===================================================================
M SConstruct
M source/blender/gpu/CMakeLists.txt
M source/blender/gpu/intern/gpu_compositing.c
M source/blender/gpu/intern/gpu_extensions.c
A source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
M source/blender/gpu/shaders/gpu_shader_fx_ssao_frag.glsl
===================================================================
diff --git a/SConstruct b/SConstruct
index c45dcf8..e53b6d9 100644
--- a/SConstruct
+++ b/SConstruct
@@ -755,6 +755,7 @@ if B.targets != ['cudakernels']:
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_ssao_frag.glsl")
+ data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_dof_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 7091ef9..d2551b0 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -58,6 +58,7 @@ set(SRC
intern/gpu_renderer.c
shaders/gpu_shader_fx_ssao_frag.glsl
+ shaders/gpu_shader_fx_dof_frag.glsl
shaders/gpu_shader_fx_vert.glsl
shaders/gpu_shader_material.glsl
shaders/gpu_shader_sep_gaussian_blur_frag.glsl
@@ -92,6 +93,7 @@ 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_ssao_frag.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_fx_dof_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 a55f323..9d211b1 100644
--- a/source/blender/gpu/intern/gpu_compositing.c
+++ b/source/blender/gpu/intern/gpu_compositing.c
@@ -231,8 +231,11 @@ bool GPU_initialize_fx_passes(GPUFX *fx, rcti *rect, rcti *scissor_rect, int fxf
bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D *v3d, struct RegionView3D *rv3d) {
GPUShader *fx_shader;
- int numslots = 0, i;
-
+ int numslots = 0;
+
+ /* dimensions of screen (used in many shaders)*/
+ float screen_dim[2] = {fx->gbuffer_dim[0], fx->gbuffer_dim[1]};
+
if (fx->effects == 0)
return false;
@@ -241,7 +244,6 @@ 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);
@@ -252,7 +254,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D *v3d, struct RegionView3D
/* ssao pass */
if (fx->effects & V3D_FX_SSAO) {
- fx_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD);
+ fx_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_SSAO);
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] = {
@@ -261,14 +263,10 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D *v3d, struct RegionView3D
{-1.0f, 1.0f, -1.0f, 1.0f}
};
int i;
- int screendim_uniform, color_uniform, depth_uniform, dof_uniform, blurred_uniform;
+ int screendim_uniform, color_uniform, depth_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];
@@ -311,10 +309,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D *v3d, struct RegionView3D
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");
@@ -327,7 +322,6 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D *v3d, struct RegionView3D
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]);
@@ -335,13 +329,6 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D *v3d, struct RegionView3D
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++);
@@ -350,27 +337,62 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D *v3d, struct RegionView3D
GPU_texture_bind(fx->jitter_buffer, numslots++);
GPU_shader_uniform_texture(fx_shader, ssao_jitter_uniform, fx->jitter_buffer);
+
+ /* set invalid color in case shader fails */
+ glColor3f(1.0, 0.0, 1.0);
+
+ /* draw */
+ glDisable(GL_DEPTH_TEST);
+ glDrawArrays(GL_QUADS, 0, 4);
+ /* disable bindings */
+ GPU_texture_unbind(fx->color_buffer);
+ GPU_depth_texture_mode(fx->depth_buffer, true, false);
+ GPU_texture_unbind(fx->depth_buffer);
+
+ /* same texture may be bound to more than one slot. Use this to explicitly disable texturing everywhere */
+ for (i = numslots; i > 0; i--) {
+ glActiveTexture(GL_TEXTURE0 + i - 1);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+ }
+ numslots = 0;
}
+ }
- /* set invalid color in case shader fails */
- glColor3f(1.0, 0.0, 1.0);
- /* draw */
- glDisable(GL_DEPTH_TEST);
- glDrawArrays(GL_QUADS, 0, 4);
+ /* second pass, dof */
+ if (fx->effects & V3D_FX_DEPTH_OF_FIELD) {
+ fx_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD);
+ if (fx_shader) {
+ 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};
+ int screendim_uniform, color_uniform, depth_uniform, dof_uniform, blurred_uniform;
+
+ 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");
+ color_uniform = GPU_shader_get_uniform(fx_shader, "colorbuffer");
+ depth_uniform = GPU_shader_get_uniform(fx_shader, "depthbuffer");
+
+ GPU_shader_uniform_vector(fx_shader, dof_uniform, 2, 1, dof_params);
+ GPU_shader_uniform_vector(fx_shader, screendim_uniform, 2, 1, screen_dim);
- /* disable bindings */
- GPU_texture_unbind(fx->color_buffer);
- GPU_depth_texture_mode(fx->depth_buffer, true, false);
- GPU_texture_unbind(fx->depth_buffer);
- /* same texture may be bound to more than one slot. Use this to explicitly disable texturing everywhere */
- for (i = numslots; i > 0; i--) {
- glActiveTexture(GL_TEXTURE0 + i - 1);
- glBindTexture(GL_TEXTURE_2D, 0);
- glDisable(GL_TEXTURE_2D);
+ 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);
}
- numslots = 0;
}
glDisableClientState(GL_VERTEX_ARRAY);
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index 3d312c8..bce7414 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -82,6 +82,7 @@ extern char datatoc_gpu_shader_sep_gaussian_blur_vert_glsl[];
extern char datatoc_gpu_shader_sep_gaussian_blur_frag_glsl[];
extern char datatoc_gpu_shader_fx_vert_glsl[];
extern char datatoc_gpu_shader_fx_ssao_frag_glsl[];
+extern char datatoc_gpu_shader_fx_dof_frag_glsl[];
typedef struct GPUShaders {
GPUShader *vsm_store;
@@ -1569,10 +1570,10 @@ GPUShader *GPU_shader_get_builtin_fx_shader(int effects)
return NULL;
if (!GG.shaders.fx_shaders[effects]) {
- if (effects == GPU_SHADER_FX_DEPTH_OF_FIELD)
+ if (effects == GPU_SHADER_FX_SSAO)
GG.shaders.fx_shaders[effects] = GPU_shader_create(datatoc_gpu_shader_fx_vert_glsl, datatoc_gpu_shader_fx_ssao_frag_glsl, NULL, NULL);
else if (effects == GPU_SHADER_FX_DEPTH_OF_FIELD)
- GG.shaders.fx_shaders[effects] = GPU_shader_create(datatoc_gpu_shader_fx_vert_glsl, datatoc_gpu_shader_fx_ssao_frag_glsl, NULL, NULL);
+ GG.shaders.fx_shaders[effects] = GPU_shader_create(datatoc_gpu_shader_fx_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, NULL);
}
return GG.shaders.fx_shaders[effects];
diff --git a/source/blender/gpu/shaders/gpu_sh
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list