[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52440] trunk/blender/intern/cycles/kernel : Fix #33256: cycles Z pass for orthographic camera was not right, now is more

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Nov 21 14:00:57 CET 2012


Revision: 52440
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52440
Author:   blendix
Date:     2012-11-21 13:00:57 +0000 (Wed, 21 Nov 2012)
Log Message:
-----------
Fix #33256: cycles Z pass for orthographic camera was not right, now is more
useful for e.g. fog in compositing.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/kernel_camera.h
    trunk/blender/intern/cycles/kernel/kernel_passes.h
    trunk/blender/intern/cycles/kernel/shaders/node_texture_coordinate.osl
    trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h

Modified: trunk/blender/intern/cycles/kernel/kernel_camera.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_camera.h	2012-11-21 13:00:51 UTC (rev 52439)
+++ trunk/blender/intern/cycles/kernel/kernel_camera.h	2012-11-21 13:00:57 UTC (rev 52440)
@@ -229,5 +229,20 @@
 		camera_sample_panorama(kg, raster_x, raster_y, lens_u, lens_v, ray);
 }
 
+/* Utilities */
+
+__device_inline float camera_distance(KernelGlobals *kg, float3 P)
+{
+	Transform cameratoworld = kernel_data.cam.cameratoworld;
+	float3 camP = make_float3(cameratoworld.x.w, cameratoworld.y.w, cameratoworld.z.w);
+
+	if(kernel_data.cam.type == CAMERA_ORTHOGRAPHIC) {
+		float3 camD = make_float3(cameratoworld.x.z, cameratoworld.y.z, cameratoworld.z.z);
+		return fabsf(dot((P - camP), camD));
+	}
+	else
+		return len(P - camP);
+}
+
 CCL_NAMESPACE_END
 

Modified: trunk/blender/intern/cycles/kernel/kernel_passes.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_passes.h	2012-11-21 13:00:51 UTC (rev 52439)
+++ trunk/blender/intern/cycles/kernel/kernel_passes.h	2012-11-21 13:00:57 UTC (rev 52440)
@@ -52,9 +52,7 @@
 	if(!(path_flag & PATH_RAY_TRANSPARENT)) {
 		if(sample == 0) {
 			if(flag & PASS_DEPTH) {
-				Transform tfm = kernel_data.cam.worldtocamera;
-				float depth = len(transform_point(&tfm, sd->P));
-
+				float depth = camera_distance(kg, sd->P);
 				kernel_write_pass_float(buffer + kernel_data.film.pass_depth, sample, depth);
 			}
 			if(flag & PASS_OBJECT_ID) {

Modified: trunk/blender/intern/cycles/kernel/shaders/node_texture_coordinate.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/shaders/node_texture_coordinate.osl	2012-11-21 13:00:51 UTC (rev 52439)
+++ trunk/blender/intern/cycles/kernel/shaders/node_texture_coordinate.osl	2012-11-21 13:00:57 UTC (rev 52440)
@@ -77,5 +77,7 @@
 		Camera += Dy(Camera);
 		Window += Dy(Window);
 	}
+
+	Window[2] = 0.0;
 }
 

Modified: trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h	2012-11-21 13:00:51 UTC (rev 52439)
+++ trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h	2012-11-21 13:00:57 UTC (rev 52440)
@@ -20,17 +20,19 @@
 
 /* Texture Coordinate Node */
 
-__device_inline float3 svm_background_offset(KernelGlobals *kg)
+__device_inline float3 svm_background_position(KernelGlobals *kg, float3 P)
 {
 	Transform cameratoworld = kernel_data.cam.cameratoworld;
-	return make_float3(cameratoworld.x.w, cameratoworld.y.w, cameratoworld.z.w);
+	float3 camP = make_float3(cameratoworld.x.w, cameratoworld.y.w, cameratoworld.z.w);
+
+	return camP + P;
 }
 
 __device_inline float3 svm_world_to_ndc(KernelGlobals *kg, ShaderData *sd, float3 P)
 {
 	if(kernel_data.cam.type != CAMERA_PANORAMA) {
 		if(sd->object == ~0)
-			P += svm_background_offset(kg);
+			P = svm_background_position(kg, P);
 
 		Transform tfm = kernel_data.cam.worldtondc;
 		return transform_perspective(&tfm, P);
@@ -78,11 +80,12 @@
 			if(sd->object != ~0)
 				data = transform_point(&tfm, sd->P);
 			else
-				data = transform_point(&tfm, sd->P + svm_background_offset(kg));
+				data = transform_point(&tfm, svm_background_position(kg, sd->P));
 			break;
 		}
 		case NODE_TEXCO_WINDOW: {
 			data = svm_world_to_ndc(kg, sd, sd->P);
+			data.z = 0.0f;
 			break;
 		}
 		case NODE_TEXCO_REFLECTION: {
@@ -135,11 +138,12 @@
 			if(sd->object != ~0)
 				data = transform_point(&tfm, sd->P + sd->dP.dx);
 			else
-				data = transform_point(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
+				data = transform_point(&tfm, svm_background_position(kg, sd->P + sd->dP.dx));
 			break;
 		}
 		case NODE_TEXCO_WINDOW: {
 			data = svm_world_to_ndc(kg, sd, sd->P + sd->dP.dx);
+			data.z = 0.0f;
 			break;
 		}
 		case NODE_TEXCO_REFLECTION: {
@@ -195,11 +199,12 @@
 			if(sd->object != ~0)
 				data = transform_point(&tfm, sd->P + sd->dP.dy);
 			else
-				data = transform_point(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
+				data = transform_point(&tfm, svm_background_position(kg, sd->P + sd->dP.dy));
 			break;
 		}
 		case NODE_TEXCO_WINDOW: {
 			data = svm_world_to_ndc(kg, sd, sd->P + sd->dP.dy);
+			data.z = 0.0f;
 			break;
 		}
 		case NODE_TEXCO_REFLECTION: {




More information about the Bf-blender-cvs mailing list