Calculate per-vertex smoothTangent and keep smooth normals #2068
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The
calculateSmoothTangent
previously built the tangent space transformation matrix based upon the geometry plane only. With smooth shaded meshes, each triangle has a per-vertex normal in contrast to a per-face normal. Each normal not necessarily matches with the geometric face normal, which allows shaders to lerp between normals to create an artificial smoothness of the rendered mesh with the same amount of polygons.With this PR, the built T and B now lie within the per-vertex smooth normal and not within the geometric normal.
(The black arrow represents the geometry normal)
This is achieved by projecting the geometry points (P0, P1, P2) onto the plane of the smooth per-vertex normal plane (green) for the tangent space calculation.
The tangent space was previously also calculated per-face, not per-vertex. This hindered shaders to interpolate between tangent-spaces per-vertex (like it lerps per-vertex normals).
Also, this PR includes the retrieval of the per-vertex normals, needed for the
calculateSmoothTangent
method and smooth shading in general.