diff --git a/intern/cycles/kernel/svm/displace.h b/intern/cycles/kernel/svm/displace.h index cca9dc7a238..ba4aface005 100644 --- a/intern/cycles/kernel/svm/displace.h +++ b/intern/cycles/kernel/svm/displace.h @@ -165,7 +165,7 @@ ccl_device_noinline int svm_node_vector_displacement( tangent = normalize(sd->dPdu); } - float3 bitangent = normalize(cross(normal, tangent)); + float3 bitangent = safe_normalize(cross(normal, tangent)); const AttributeDescriptor attr_sign = find_attribute(kg, sd, node.w); if (attr_sign.offset != ATTR_STD_NOT_FOUND) { float sign = primitive_surface_attribute_float(kg, sd, attr_sign, NULL, NULL); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_vector_displacement.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_vector_displacement.glsl index 0ff074bc04f..a382887d979 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_vector_displacement.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_vector_displacement.glsl @@ -3,7 +3,7 @@ void node_vector_displacement_tangent( { vec3 oN = normalize(normal_world_to_object(g_data.N)); vec3 oT = normalize(normal_world_to_object(T.xyz)); - vec3 oB = T.w * normalize(cross(oN, oT)); + vec3 oB = T.w * safe_normalize(cross(oN, oT)); result = (vector.xyz - midlevel) * scale; result = result.x * oT + result.y * oN + result.z * oB;