[Bf-blender-cvs] [647a7980760] blender2.8: Workbench: Volume: Fix slice display opacity

Clément Foucault noreply at git.blender.org
Tue Nov 13 11:22:33 CET 2018


Commit: 647a79807600f8ad3159935d1f985fe7a1ede5fc
Author: Clément Foucault
Date:   Tue Nov 13 11:22:19 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB647a79807600f8ad3159935d1f985fe7a1ede5fc

Workbench: Volume: Fix slice display opacity

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

M	source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M	source/blender/draw/engines/workbench/workbench_volume.c

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
index 0bb6af40647..0d2d2187a85 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -198,24 +198,10 @@ void main()
 		discard;
 	}
 
-	ivec3 volume_size = textureSize(densityTexture, 0);
-	float step_len;
-	if (sliceAxis == 0) {
-		step_len = float(volume_size.x);
-	}
-	else if (sliceAxis == 1) {
-		step_len = float(volume_size.y);
-	}
-	else {
-		step_len = float(volume_size.z);
-	}
-	/* FIXME Should be in world space but is in local space. */
-	step_len = 1.0 / step_len;
-
 	vec3 Lscat;
 	float s_extinction, Tr;
 	volume_properties(localPos, Lscat, s_extinction);
-	eval_volume_step(Lscat, s_extinction, step_len, Tr);
+	eval_volume_step(Lscat, s_extinction, stepLength, Tr);
 
 	fragColor = vec4(Lscat, Tr);
 #else
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c
index fa6f740be1a..a4cd81e7fd2 100644
--- a/source/blender/draw/engines/workbench/workbench_volume.c
+++ b/source/blender/draw/engines/workbench/workbench_volume.c
@@ -157,17 +157,23 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec
 		const int axis = (sds->slice_axis == SLICE_AXIS_AUTO)
 		                  ? axis_dominant_v3_single(invviewmat[2])
 		                  : sds->slice_axis - 1;
+		float dim[3];
+		BKE_object_dimensions_get(ob, dim);
+		/* 0.05f to acheive somewhat the same opacity as the full view.  */
+		float step_length = max_ff(1e-16f, dim[axis] * 0.05f);
 
 		grp = DRW_shgroup_create(sh, vedata->psl->volume_pass);
 		DRW_shgroup_uniform_float_copy(grp, "slicePosition", sds->slice_depth);
 		DRW_shgroup_uniform_int_copy(grp, "sliceAxis", axis);
+		DRW_shgroup_uniform_float_copy(grp, "stepLength", step_length);
+		DRW_shgroup_state_disable(grp, DRW_STATE_CULL_FRONT);
 	}
 	else {
 		double noise_ofs;
 		BLI_halton_1D(3, 0.0, effect_info->jitter_index, &noise_ofs);
 		float dim[3], step_length, max_slice;
 		float slice_ct[3] = {sds->res[0], sds->res[1], sds->res[2]};
-		mul_v3_fl(slice_ct, sds->slice_per_voxel);
+		mul_v3_fl(slice_ct, max_ff(0.001f, sds->slice_per_voxel));
 		max_slice = max_fff(slice_ct[0], slice_ct[1], slice_ct[2]);
 		BKE_object_dimensions_get(ob, dim);
 		invert_v3(slice_ct);
@@ -179,6 +185,7 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec
 		DRW_shgroup_uniform_int_copy(grp, "samplesLen", max_slice);
 		DRW_shgroup_uniform_float_copy(grp, "stepLength", step_length);
 		DRW_shgroup_uniform_float_copy(grp, "noiseOfs", noise_ofs);
+		DRW_shgroup_state_enable(grp, DRW_STATE_CULL_FRONT);
 	}
 
 	if (sds->use_coba) {



More information about the Bf-blender-cvs mailing list