Merged
Conversation
Simply rotate each primitive in the index buffer to simulate a different provoking vertex. Since at this point we have already generated a plain primitive index buffer, it's easy to manipulate like this. An even better solution would be to generate rotated index buffers directly during decode, although that code is super critical and does not need more complexity.. We could now also enable this for hardware transform but I'm leaving that for later.
Owner
Author
|
Actually, I think the old provoking vertex fix worked by accident in the blade dancer frame dump. It uses a mix of triangle strips and single triangles, and we probably need to apply the provoking vertex rule directly when converting strips to lists - which we were only doing for half the triangles, the others were rotated wrong! With the latest commits, it's working perfectly. The real proper fix here would be to modify IndexGenerator to take the provoking vertex rule of the current backend API into account, but I don't really want to add any complexity on that path, so post-processing the vertex buffer will do for now. |
c8dccd4 to
7738899
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Followup to #19331, fixes #19323.
Instead of manipulating the vertex data (which didn't really work when vertices were shared between triangles), let's just rotate the indices of each triangle to achieve the correct provoking vertex behavior. Currently only in software transform but we could just as well do this for hardware transform.
Triangle ABC is really the same as BCA, only that instead of A being last (and thus provoking on OpenGL) it's now first and provoking on D3D/Vulkan-without-extension.
("Provoking" means which vertex of a triangle provides the value for flat shaded attributes, like color or normal. The PSP has the OpenGL behavior. The original issue motivating fixing it is #10969 ).
Converted to draft because somehow, #4140 (comment) (Blade Dancer, dump available) is only partially fixed with this.