Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Dinges <blender@dingto.org>2014-06-13 23:27:21 +0400
committerThomas Dinges <blender@dingto.org>2014-06-13 23:59:13 +0400
commit49df707496e505c8a8b21c1ea36b479e950cc66c (patch)
tree29ad1b81a9cc9cbb020d114772319171500fab61 /intern/cycles/kernel/geom/geom_triangle.h
parentcd5e1ff74e4f6443f3e4b836dd23fe46b56cb7ed (diff)
Cycles: Calculate face normal on the fly.
Instead of pre-calculation and storage, we now calculate the face normal during render. This gives a small slowdown (~1%) but decreases memory usage, which is especially important for GPUs, where you have limited VRAM. Part of my GSoC 2014.
Diffstat (limited to 'intern/cycles/kernel/geom/geom_triangle.h')
-rw-r--r--intern/cycles/kernel/geom/geom_triangle.h22
1 files changed, 19 insertions, 3 deletions
diff --git a/intern/cycles/kernel/geom/geom_triangle.h b/intern/cycles/kernel/geom/geom_triangle.h
index 355e36fef0c..4ee5d5aa6d5 100644
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@ -116,6 +116,20 @@ ccl_device_inline float3 triangle_refine_subsurface(KernelGlobals *kg, ShaderDat
#endif
}
+/* normal on triangle */
+ccl_device_inline float3 triangle_normal(KernelGlobals *kg, int prim)
+{
+ /* load triangle vertices */
+ float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, prim));
+
+ float3 v0 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x)));
+ float3 v1 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.y)));
+ float3 v2 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)));
+
+ /* return normal */
+ return normalize(cross(v1 - v0, v2 - v0));
+}
+
/* point and normal on triangle */
ccl_device_inline void triangle_point_normal(KernelGlobals *kg, int prim, float u, float v, float3 *P, float3 *Ng, int *shader)
{
@@ -130,9 +144,11 @@ ccl_device_inline void triangle_point_normal(KernelGlobals *kg, int prim, float
float t = 1.0f - u - v;
*P = (u*v0 + v*v1 + t*v2);
- float4 Nm = kernel_tex_fetch(__tri_normal, prim);
- *Ng = make_float3(Nm.x, Nm.y, Nm.z);
- *shader = __float_as_int(Nm.w);
+ /* compute normal */
+ *Ng = normalize(cross(v1 - v0, v2 - v0));
+
+ /* shader`*/
+ *shader = __float_as_int(kernel_tex_fetch(__tri_shader, prim));
}
/* Triangle vertex locations */