Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved provoking vertex fix #19334

Merged
merged 5 commits into from
Jul 17, 2024
Merged

Improved provoking vertex fix #19334

merged 5 commits into from
Jul 17, 2024

Conversation

hrydgard
Copy link
Owner

@hrydgard hrydgard commented Jul 17, 2024

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.

@hrydgard hrydgard added this to the v1.18.0 milestone Jul 17, 2024
@hrydgard hrydgard added the GE emulation Backend-independent GPU issues label Jul 17, 2024
@hrydgard hrydgard marked this pull request as draft July 17, 2024 12:00
hrydgard added 5 commits July 17, 2024 14:40
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.
@hrydgard
Copy link
Owner Author

hrydgard commented Jul 17, 2024

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.

@hrydgard hrydgard force-pushed the improved-provoking-vertex-fix branch from c8dccd4 to 7738899 Compare July 17, 2024 14:14
@hrydgard hrydgard marked this pull request as ready for review July 17, 2024 14:20
@hrydgard hrydgard merged commit b8f0558 into master Jul 17, 2024
18 checks passed
@hrydgard hrydgard deleted the improved-provoking-vertex-fix branch July 17, 2024 14:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
GE emulation Backend-independent GPU issues
Projects
None yet
Development

Successfully merging this pull request may close these issues.

GTA 3 LCS: Minor rendering glitch when in-game popup shows
1 participant