Commit: 0782c680a66e4e83030486996e7a4b0a5128bcba
Author: Antony Riakiotakis
Date:   Tue Oct 28 19:07:58 2014 +0100
Branches: viewport_experiments
https://developer.blender.org/rB0782c680a66e4e83030486996e7a4b0a5128bcba

Add a library file for projection shader code, should enable us to use
optimized position calculation again - relevant for both SSAO and DOF

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

M       source/blender/gpu/CMakeLists.txt
M       source/blender/gpu/GPU_extensions.h
M       source/blender/gpu/intern/gpu_compositing.c
M       source/blender/gpu/intern/gpu_extensions.c
M       source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
A       source/blender/gpu/shaders/gpu_shader_fx_lib.glsl
M       source/blender/gpu/shaders/gpu_shader_fx_ssao_frag.glsl

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

diff --git a/source/blender/gpu/CMakeLists.txt 
b/source/blender/gpu/CMakeLists.txt
index d2551b0..555c100 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -57,6 +57,7 @@ set(SRC
        intern/gpu_compositing.c
        intern/gpu_renderer.c
 
+       shaders/gpu_shader_fx_lib.glsl
        shaders/gpu_shader_fx_ssao_frag.glsl
        shaders/gpu_shader_fx_dof_frag.glsl
        shaders/gpu_shader_fx_vert.glsl
@@ -94,6 +95,7 @@ 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)
+data_to_c_simple(shaders/gpu_shader_fx_lib.glsl SRC)
 
 if(WITH_GAMEENGINE)
        add_definitions(-DWITH_GAMEENGINE)
diff --git a/source/blender/gpu/GPU_extensions.h 
b/source/blender/gpu/GPU_extensions.h
index 9bff739..841fe2a 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -190,7 +190,7 @@ typedef enum GPUBuiltinShader {
 } GPUBuiltinShader;
 
 GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader);
-GPUShader *GPU_shader_get_builtin_fx_shader(int effects);
+GPUShader *GPU_shader_get_builtin_fx_shader(int effects, bool persp);
 
 void GPU_shader_free_builtin_shaders(void);
 
diff --git a/source/blender/gpu/intern/gpu_compositing.c 
b/source/blender/gpu/intern/gpu_compositing.c
index 2bd45f9..6dde144 100644
--- a/source/blender/gpu/intern/gpu_compositing.c
+++ b/source/blender/gpu/intern/gpu_compositing.c
@@ -276,9 +276,16 @@ 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, struct Scene *scene) {
        GPUShader *fx_shader;
        int numslots = 0;
-
+       float invproj[4][4];
+       int i;
        /* dimensions of screen (used in many shaders)*/
        float screen_dim[2] = {fx->gbuffer_dim[0], fx->gbuffer_dim[1]};
+       /* view vectors for the corners of the view frustum. Can be used to 
recreate the world space position easily */
+       float 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}
+       };
 
        if (fx->effects == 0)
                return false;
@@ -295,45 +302,36 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D 
*v3d, struct RegionView3D
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
        /* full screen FX pass */
-       
+
+       /* 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, viewvecs[i]);
+               /* normalized trick see 
http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer
 */
+               mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][3]);
+               mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][2]);
+               viewvecs[i][2] = 1.0;
+       }
+
+       /* we need to store the differences */
+       viewvecs[1][0] -= viewvecs[0][0];
+       viewvecs[1][1] = viewvecs[2][1] - viewvecs[0][1];
+
        /* ssao pass */
        if (fx->effects & V3D_FX_SSAO) {
-               fx_shader = 
GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_SSAO);
+               fx_shader = 
GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_SSAO, rv3d->is_persp);
                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;
-                       int ssao_uniform, ssao_color_uniform, 
ssao_viewvecs_uniform, ssao_sample_params_uniform;
+                       int ssao_uniform, ssao_color_uniform, viewvecs_uniform, 
ssao_sample_params_uniform;
                        int ssao_jitter_uniform, ssao_direction_uniform;
                        float ssao_params[4] = {v3d->ssao_distance_max, 
v3d->ssao_darkening, v3d->ssao_attenuation, 0.0f};
                        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;
@@ -358,7 +356,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D 
*v3d, struct RegionView3D
                        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");
+                       viewvecs_uniform = GPU_shader_get_uniform(fx_shader, 
"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");
@@ -368,7 +366,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D 
*v3d, struct RegionView3D
                        GPU_shader_uniform_vector(fx_shader, screendim_uniform, 
2, 1, screen_dim);
                        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, viewvecs_uniform, 
4, 3, 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]);
 
@@ -406,11 +404,11 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D 
*v3d, struct RegionView3D
 
        /* 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);
+               fx_shader = 
GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_OF_FIELD, rv3d->is_persp);
                if (fx_shader) {
-                       int i;
                        float dof_params[4];
                        int screendim_uniform, color_uniform, depth_uniform, 
dof_uniform, blurred_uniform;
+                       int viewvecs_uniform;
 
                        float scale = scene->unit.system ? 
scene->unit.scale_length : 1.0f;
                        float scale_camera = 0.001f / scale;
@@ -426,11 +424,13 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D 
*v3d, struct RegionView3D
                        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");
+                       viewvecs_uniform = GPU_shader_get_uniform(fx_shader, 
"viewvecs");
 
                        GPU_shader_bind(fx_shader);
 
                        GPU_shader_uniform_vector(fx_shader, dof_uniform, 4, 1, 
dof_params);
                        GPU_shader_uniform_vector(fx_shader, screendim_uniform, 
2, 1, screen_dim);
+                       GPU_shader_uniform_vector(fx_shader, viewvecs_uniform, 
4, 3, viewvecs[0]);
 
                        GPU_texture_bind(fx->color_buffer, numslots++);
                        GPU_shader_uniform_texture(fx_shader, blurred_uniform, 
fx->color_buffer);
diff --git a/source/blender/gpu/intern/gpu_extensions.c 
b/source/blender/gpu/intern/gpu_extensions.c
index bce7414..36f9023 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -83,12 +83,13 @@ 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[];
+extern char datatoc_gpu_shader_fx_lib_glsl[];
 
 typedef struct GPUShaders {
        GPUShader *vsm_store;
        GPUShader *sep_gaussian_blur;
        /* cache for shader fx. Those can exist in combinations so store them 
here */
-       GPUShader *fx_shaders[MAX_FX_SHADERS];
+       GPUShader *fx_shaders[MAX_FX_SHADERS * 2];
 } GPUShaders;
 
 static struct GPUGlobal {
@@ -1563,20 +1564,29 @@ GPUShader 
*GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
        return retval;
 }
 
-GPUShader *GPU_shader_get_builtin_fx_shader(int effects)
+GPUShader *GPU_shader_get_builtin_fx_shader(int effects, bool persp)
 {
+       int offset;
+       const char *defines = NULL;
        /* avoid shaders out of range */
        if (effects >= MAX_FX_SHADERS)
                return NULL;
        
-       if (!GG.shaders.fx_shaders[effects]) {
+       offset = 2 * effects;
+
+       if (persp) {
+               offset += 1;
+               defines = "#define PERSP_MATRIX\n";
+       }
+
+       if (!GG.shaders.fx_shaders[offset]) {
                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);
+                       GG.shaders.fx_shaders[offset] = 
GPU_shader_create(datatoc_gpu_shader_fx_vert_glsl, 
datatoc_gpu_shader_fx_ssao_frag_glsl, datatoc_gpu_shader_fx_lib_glsl, defines);
                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_dof_frag_glsl, NULL, NULL);
+                       GG.shaders.fx_shaders[offset] = 
GPU_shader_create(datatoc_gpu_shader_fx_vert_glsl, 
datatoc_gpu_shader_fx_dof_frag_glsl, datatoc_gpu_shader_fx_lib_glsl, defines);
        }
        
-       return GG.shaders.fx_shaders[effects];
+       return GG.shaders.fx_shaders[offset];
 }
 
 
@@ -1594,7 +1604,7 @@ void GPU_shader_free_builtin_shaders(void)
                GG.shaders.sep_gaussian_blur = NULL;
        }
        
-       for (i = 0; i < MAX_FX_SHADERS; i++) {
+       for (i = 0; i < 2 * MAX_FX_SHADERS; i++) {
                if (GG.shaders.fx_shaders[i]) {
                        MEM_freeN(GG.shaders.fx_shaders[i]);
                        GG.shaders.fx_shaders[i] = NULL;
diff --git a/source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl 
b/source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
index a5a6bfc..6f0521e 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
+++ b/sour

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to