diff options
author | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2021-08-13 13:56:05 +0300 |
---|---|---|
committer | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2021-08-13 13:56:05 +0300 |
commit | f3d502bf63fc7c98ccce87f109947805fb28b91e (patch) | |
tree | 74dd77402f67c278b630473c6f8c357d1546f456 /intern | |
parent | 759955c48a45768fbae7d57fc828487a0ba19168 (diff) |
Avoid copying twice vertex normals
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/svm/svm_tex_coord.h | 8 | ||||
-rw-r--r-- | intern/cycles/render/geometry.cpp | 15 |
2 files changed, 18 insertions, 5 deletions
diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h index fc46bb584be..126fa53122e 100644 --- a/intern/cycles/kernel/svm/svm_tex_coord.h +++ b/intern/cycles/kernel/svm/svm_tex_coord.h @@ -267,7 +267,7 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st if (space == NODE_NORMAL_MAP_TANGENT) { /* tangent space */ - if (sd->object == OBJECT_NONE) { + if (sd->object == OBJECT_NONE || (sd->prim & PRIMITIVE_ALL_TRIANGLE) == 0) { /* Fallback to unperturbed normal. */ stack_store_float3(stack, normal_offset, sd->N); return; @@ -276,10 +276,8 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st /* first try to get tangent attribute */ const AttributeDescriptor attr = find_attribute(kg, sd, node.z); const AttributeDescriptor attr_sign = find_attribute(kg, sd, node.w); - const AttributeDescriptor attr_normal = find_attribute(kg, sd, ATTR_STD_VERTEX_NORMAL); - if (attr.offset == ATTR_STD_NOT_FOUND || attr_sign.offset == ATTR_STD_NOT_FOUND || - attr_normal.offset == ATTR_STD_NOT_FOUND) { + if (attr.offset == ATTR_STD_NOT_FOUND || attr_sign.offset == ATTR_STD_NOT_FOUND) { /* Fallback to unperturbed normal. */ stack_store_float3(stack, normal_offset, sd->N); return; @@ -291,7 +289,7 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st float3 normal; if (sd->shader & SHADER_SMOOTH_NORMAL) { - normal = primitive_surface_attribute_float3(kg, sd, attr_normal, NULL, NULL); + normal = triangle_smooth_normal(kg, sd->Ng, sd->prim, sd->u, sd->v); } else { normal = sd->Ng; diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp index b81d8b008d3..b0e118dd127 100644 --- a/intern/cycles/render/geometry.cpp +++ b/intern/cycles/render/geometry.cpp @@ -792,6 +792,11 @@ void GeometryManager::device_update_attributes(Device *device, foreach (AttributeRequest &req, attributes.requests) { Attribute *attr = geom->attributes.find(req); + /* Vertex normals are stored in DeviceScene.tri_vnormal. */ + if (attr && attr->std == ATTR_STD_VERTEX_NORMAL) { + continue; + } + update_attribute_element_size(geom, attr, ATTR_PRIM_GEOMETRY, @@ -853,6 +858,11 @@ void GeometryManager::device_update_attributes(Device *device, Attribute *attr = geom->attributes.find(req); if (attr) { + /* Vertex normals are stored in DeviceScene.tri_vnormal. */ + if (attr->std == ATTR_STD_VERTEX_NORMAL) { + continue; + } + /* force a copy if we need to reallocate all the data */ attr->modified |= attributes_need_realloc[Attribute::kernel_type(*attr)]; } @@ -872,6 +882,11 @@ void GeometryManager::device_update_attributes(Device *device, Attribute *subd_attr = mesh->subd_attributes.find(req); if (subd_attr) { + /* Vertex normals are stored in DeviceScene.tri_vnormal. */ + if (subd_attr->std == ATTR_STD_VERTEX_NORMAL) { + continue; + } + /* force a copy if we need to reallocate all the data */ subd_attr->modified |= attributes_need_realloc[Attribute::kernel_type(*subd_attr)]; } |