[Bf-blender-cvs] [d2d3bd3] viewport_experiments: Use optimized view space reconstruction for ortho case as well.
Antony Riakiotakis
noreply at git.blender.org
Tue Oct 28 19:44:15 CET 2014
Commit: d2d3bd35c1c310369678f45ad45fe88aa1e1a3ea
Author: Antony Riakiotakis
Date: Tue Oct 28 19:44:05 2014 +0100
Branches: viewport_experiments
https://developer.blender.org/rBd2d3bd35c1c310369678f45ad45fe88aa1e1a3ea
Use optimized view space reconstruction for ortho case as well.
===================================================================
M source/blender/gpu/intern/gpu_compositing.c
M source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
M 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/intern/gpu_compositing.c b/source/blender/gpu/intern/gpu_compositing.c
index 6dde144..dfd7105 100644
--- a/source/blender/gpu/intern/gpu_compositing.c
+++ b/source/blender/gpu/intern/gpu_compositing.c
@@ -278,6 +278,8 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D *v3d, struct RegionView3D
int numslots = 0;
float invproj[4][4];
int i;
+ /* number of passes left. when there are no more passes, the result is passed to the frambuffer */
+ int passes_left;
/* 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 */
@@ -311,14 +313,23 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, struct View3D *v3d, struct RegionView3D
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;
+ if (rv3d->is_persp)
+ mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][2]);
+ viewvecs[i][3] = 1.0;
}
/* we need to store the differences */
viewvecs[1][0] -= viewvecs[0][0];
viewvecs[1][1] = viewvecs[2][1] - viewvecs[0][1];
+ /* calculate a depth offset as well */
+ if (!rv3d->is_persp) {
+ float vec_far[] = {-1.0f, -1.0f, 1.0f, 1.0f};
+ mul_m4_v4(invproj, vec_far);
+ mul_v3_fl(vec_far, 1.0f / vec_far[3]);
+ viewvecs[1][2] = vec_far[2] - viewvecs[0][2];
+ }
+
/* ssao pass */
if (fx->effects & V3D_FX_SSAO) {
fx_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_SSAO, rv3d->is_persp);
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 6f0521e..c12b27d 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
@@ -28,7 +28,7 @@ void main()
{
float depth = texture2D(depthbuffer, uvcoordsvar.xy).r;
- vec3 position = get_view_space_from_depth(uvcoordsvar.xy, viewvecs[0].xy, viewvecs[1].xy, depth);
+ vec3 position = get_view_space_from_depth(uvcoordsvar.xy, viewvecs[0].xyz, viewvecs[1].xyz, depth);
float coc = calculate_dof_coc(position);
gl_FragColor = vec4(coc, coc, coc, 1.0);
diff --git a/source/blender/gpu/shaders/gpu_shader_fx_lib.glsl b/source/blender/gpu/shaders/gpu_shader_fx_lib.glsl
index 26ad0c3..d5841a9 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_lib.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_fx_lib.glsl
@@ -8,7 +8,7 @@ vec3 calculate_view_space_normal(in vec3 viewposition)
#ifdef PERSP_MATRIX
-vec3 get_view_space_from_depth(in vec2 uvcoords, in vec2 viewvec_origin, in vec2 viewvec_diff, float depth)
+vec3 get_view_space_from_depth(in vec2 uvcoords, in vec3 viewvec_origin, in vec3 viewvec_diff, float depth)
{
/* simple depth reconstruction, see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer
* we change the factors from the article to fit the OpennGL model. */
@@ -17,27 +17,20 @@ vec3 get_view_space_from_depth(in vec2 uvcoords, in vec2 viewvec_origin, in vec2
float zview = -gl_ProjectionMatrix[3][2] / (d + gl_ProjectionMatrix[2][2]);
- return vec3(zview * (viewvec_origin + uvcoords * viewvec_diff), zview);
+ return zview * (viewvec_origin + vec3(uvcoords, 0.0) * viewvec_diff);
}
#else
-vec3 get_view_space_from_depth(in vec2 uvcoords, in vec2 viewvec_origin, in vec2 viewvec_diff, float depth)
+vec3 get_view_space_from_depth(in vec2 uvcoords, in vec3 viewvec_origin, in vec3 viewvec_diff, float depth)
{
/* simple depth reconstruction, see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer
- * we change the factors from the article to fit the OpennGL model.
- float d = 2.0 * depth - 1.0;
-
- float zview = -gl_ProjectionMatrix[2][3] / (d + gl_ProjectionMatrix[2][2]);
-
- vec3 pos = vec3(zview * (ssao_viewvecs[0].xy + uvcoords * ssao_viewvecs[1].xy), zview);
- */
- vec4 pos = 2.0 * vec4(uvcoords.xy, depth, 1.0) - vec4(1.0);
+ * we change the factors from the article to fit the OpennGL model. */
- pos = gl_ProjectionMatrixInverse * pos;
- pos /= pos.w;
+ float d = 2.0 * depth - 1.0;
+ vec3 offset = vec3(uvcoords, d);
- return pos.xyz;
+ return vec3(viewvec_origin + offset * viewvec_diff);
}
#endif
\ No newline at end of file
diff --git a/source/blender/gpu/shaders/gpu_shader_fx_ssao_frag.glsl b/source/blender/gpu/shaders/gpu_shader_fx_ssao_frag.glsl
index 3f112b3..1f6c9d1f 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_ssao_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_fx_ssao_frag.glsl
@@ -32,7 +32,7 @@ float calculate_ssao_factor(float depth)
if (depth == 1.0)
return 0.0;
- vec3 position = get_view_space_from_depth(uvcoordsvar.xy, viewvecs[0].xy, viewvecs[1].xy, depth);
+ vec3 position = get_view_space_from_depth(uvcoordsvar.xy, viewvecs[0].xyz, viewvecs[1].xyz, depth);
vec3 normal = calculate_view_space_normal(position);
// find the offset in screen space by multiplying a point in camera space at the depth of the point by the projection matrix.
@@ -55,7 +55,7 @@ float calculate_ssao_factor(float depth)
float depth_new = texture2D(depthbuffer, uvcoords).r;
if (depth_new != 1.0) {
- vec3 pos_new = get_view_space_from_depth(uvcoords, viewvecs[0].xy, viewvecs[1].xy, depth_new);
+ vec3 pos_new = get_view_space_from_depth(uvcoords, viewvecs[0].xyz, viewvecs[1].xyz, depth_new);
vec3 dir = pos_new - position;
float len = length(dir);
float f = dot(dir, normal);
More information about the Bf-blender-cvs
mailing list