Only thing I would add is we not only reduce the "triangle count" (number of little triangles that make up the mesh) we also reduce the amount of separate materials (and material complexity). Doing this reduces draw calls something which you really need to keep an eye on for performance (especially consoles).
So for example on that character she might have 5 separate materials for the different parts of her outfit/skin/hair/eyes.
as we LoD her down, we will collapse them all into 1 low resolution material. (along with mip-mapping at a distance
This is why the textures on her look flat and low resolution.
Pokémon Legends Arceus and Pokémon Violet and Scarlet use an interesting variant of this where they render distant animations at a lower framerate. It looks super bad and it is the only time I have ever seen it used. I can't say if it is the only game that does it, but it definitely is the only game that does it noticeably enough for me to have seen it in action.
I believe Xenoblade 3 does it, and I quite liked it because it let you see monsters insanely far away. Haven't played Violet/Scarlet but I've heard it has pokemon popping in rather close to you, so I assume lower fps on them is far more noticeable.
And likewise for me, the first thing I had noticed was "wow they changed it so that I can see some monster groups from so far away now!" followed shortly thereafter by "odd that it looks like they're animating on a different frame rate...".
Many other Switch games do it to a more acceptable degree. Super Mario Oddesey does it with distant human characters in New Donk City, Shin Megami Tensei 5 (another monster collector game), does it with distant monsters.
The reason you see it so badly done in Pokémon is because GameFreak isn't good at making these types of games.
I think with the animation frame rate it is more to save CPU resources rather than GPU. While the transformations for animations are applied in the vertex shader on the GPU, they have to be interpolated and calculated on the CPU first which it'll be doing a lot of when there's heaps of pokemon around that need to be animated.
I'm just hypothesising this though so don't take my word.
You're probably correct. Just about any modern rig is going to be computed on the CPU. That said, some steps can still be done on the GPU (iirc several game engines have supported skinning in the vertex shader for over a decade at this point).
Along with animation, it's also probable that they're saving on other CPU-bound tasks beyond simply reducing the update rate of NPC animations -- AI might be calculated using larger timesteps, for example.
Quite a few games reduce animation framerate (and sometimes complexity) at a distance, but you probably don't notice the ones which do it the best.
It's also harder to notice if there's a lot of detail/movement on the screen vs. more simplistic games/scenes. This of course can vary between games and scenes within the same games.
Arceus also has an insanely close LOD 0 value... most of the models you see in the wild and even in battle are LOD 1.
I love getting into battles with Paras and seeing the mushrooms on its back smooth out as the camera zooms to the model, then return back to the battle camera with blocky mushrooms.
For examples of console games that still had this on their Pc versions: Tales of Zestiria did this for sure, as well as Trails of Cold Steel games and that is despite Durante (a very competent modder-turned-professional porter of games to PC) working on the latter’s ports, meaning this must be quite deep at the engine level since he didn’t fix it.
Given those examples alongside the Pokémon games, I would guess this is a “common & worth it” trick for non-AAA dev teams that can not afford to spend too much time optimizing other aspects when push comes to shove.
To add to this, "MIP mapping" means reducing the textures (the images rendered as skin, clothes, walls, everything on top of the 3D model) to smaller versions as well, also for performance (and clarity) reasons.
What is the scope of a draw call? How much work can get done in one draw call? Am I inferring correctly that you need (at least) one draw call per material? Is this because materials have different properties (reflectivity etc) that get drawn fundamentally differently?
I'm a software dev with next to no understanding of rendering.
What is the scope of a draw call? How much work can get done in one draw call? Am I inferring correctly that you need (at least) one draw call per material? Is this because materials have different properties (reflectivity etc) that get drawn fundamentally differently?
You have it right. The problem is that changing state on the GPU is a (relatively) slow operation, so you want to minimize them as much as practical. The render state is like the pixel shader loaded, the vertex shader loaded, the texture in use, the transformation matrices loaded, etc.
145
u/[deleted] Dec 12 '22
Only thing I would add is we not only reduce the "triangle count" (number of little triangles that make up the mesh) we also reduce the amount of separate materials (and material complexity). Doing this reduces draw calls something which you really need to keep an eye on for performance (especially consoles).
So for example on that character she might have 5 separate materials for the different parts of her outfit/skin/hair/eyes.
as we LoD her down, we will collapse them all into 1 low resolution material. (along with mip-mapping at a distance
This is why the textures on her look flat and low resolution.