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.
This commit is contained in:
@@ -252,8 +252,7 @@ ccl_device bool BVH_FUNCTION_NAME
|
||||
if(kernel_tex_fetch(__prim_type, isect_array->prim) & PRIMITIVE_ALL_TRIANGLE)
|
||||
#endif
|
||||
{
|
||||
float4 Ns = kernel_tex_fetch(__tri_normal, prim);
|
||||
shader = __float_as_int(Ns.w);
|
||||
shader = __float_as_int(kernel_tex_fetch(__tri_shader, prim));
|
||||
}
|
||||
#ifdef __HAIR__
|
||||
else {
|
||||
|
||||
@@ -233,8 +233,7 @@ ccl_device_inline float3 motion_triangle_refine_subsurface(KernelGlobals *kg, Sh
|
||||
ccl_device_noinline void motion_triangle_shader_setup(KernelGlobals *kg, ShaderData *sd, const Intersection *isect, const Ray *ray, bool subsurface)
|
||||
{
|
||||
/* get shader */
|
||||
float4 Ns = kernel_tex_fetch(__tri_normal, sd->prim);
|
||||
sd->shader = __float_as_int(Ns.w);
|
||||
sd->shader = __float_as_int(kernel_tex_fetch(__tri_shader, sd->prim));
|
||||
|
||||
/* get motion info */
|
||||
int numsteps, numverts;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -86,9 +86,8 @@ ccl_device void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
|
||||
#endif
|
||||
if(sd->type & PRIMITIVE_TRIANGLE) {
|
||||
/* static triangle */
|
||||
float4 Ns = kernel_tex_fetch(__tri_normal, sd->prim);
|
||||
float3 Ng = make_float3(Ns.x, Ns.y, Ns.z);
|
||||
sd->shader = __float_as_int(Ns.w);
|
||||
float3 Ng = triangle_normal(kg, sd->prim);
|
||||
sd->shader = __float_as_int(kernel_tex_fetch(__tri_shader, sd->prim));
|
||||
|
||||
/* vectors */
|
||||
sd->P = triangle_refine(kg, sd, isect, ray);
|
||||
@@ -166,9 +165,8 @@ ccl_device_inline void shader_setup_from_subsurface(KernelGlobals *kg, ShaderDat
|
||||
|
||||
/* fetch triangle data */
|
||||
if(sd->type == PRIMITIVE_TRIANGLE) {
|
||||
float4 Ns = kernel_tex_fetch(__tri_normal, sd->prim);
|
||||
float3 Ng = make_float3(Ns.x, Ns.y, Ns.z);
|
||||
sd->shader = __float_as_int(Ns.w);
|
||||
float3 Ng = triangle_normal(kg, sd->prim);
|
||||
sd->shader = __float_as_int(kernel_tex_fetch(__tri_shader, sd->prim));
|
||||
|
||||
/* static triangle */
|
||||
sd->P = triangle_refine_subsurface(kg, sd, isect, ray);
|
||||
@@ -1028,8 +1026,7 @@ ccl_device bool shader_transparent_shadow(KernelGlobals *kg, Intersection *isect
|
||||
#ifdef __HAIR__
|
||||
if(kernel_tex_fetch(__prim_type, isect->prim) & PRIMITIVE_ALL_TRIANGLE) {
|
||||
#endif
|
||||
float4 Ns = kernel_tex_fetch(__tri_normal, prim);
|
||||
shader = __float_as_int(Ns.w);
|
||||
shader = __float_as_int(kernel_tex_fetch(__tri_shader, prim));
|
||||
#ifdef __HAIR__
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -36,7 +36,7 @@ KERNEL_TEX(float4, texture_float4, __objects)
|
||||
KERNEL_TEX(float4, texture_float4, __objects_vector)
|
||||
|
||||
/* triangles */
|
||||
KERNEL_TEX(float4, texture_float4, __tri_normal)
|
||||
KERNEL_TEX(float, texture_float, __tri_shader)
|
||||
KERNEL_TEX(float4, texture_float4, __tri_vnormal)
|
||||
KERNEL_TEX(float4, texture_float4, __tri_vindex)
|
||||
KERNEL_TEX(float4, texture_float4, __tri_verts)
|
||||
|
||||
Reference in New Issue
Block a user