Skip to content

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
@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

2 participants