"Yes, but how many polygons?" An artist blog entry with interesting numbers

Sakura Wars 4 - dreamcast, pc
* low poly lod models are around 1,200 for player characters when the unit is inactive. It automatically switches to high poly lod when active and in cutscenes. regular enemies are between 700- 1,200 triangles.

Sobu - 2,938 triangles
sakurat49.jpg


Ogami Ichiro - 1,842 triangles
sakurat41.jpg


Kobu f2( Erica) - 2,355 triangles
sakurat42.jpg


kobu f2 ( hannabi) 2,359 triangles
sakurat43.jpg


Kobu custom( ogami) (destroed/damaged) 3,540 triangles
sakurat44.jpg


Ōkubo Nagayasu (Antagonist)- 1,103 triangles
sakurat45.jpg


Final boss (phase1) - 4,887 triangles
sakurat46.jpg


final boss (phase 2) - 3,058 triangles
sakurat47.jpg


Stage 2 - 4,906 triangles
sakurat48.jpg
 
An update on fake polygon counts: I've been doing some benchmarking, and if you just flood the PVR with off-screen vertices, it looks like the best vertex count you can get is only around 7.9 million vertices per second, or 253 MB/s of vertex data (32 bytes per vertex).

For anyone whose interested, I just found a flaw in my benchmark. I was using a custom library to generate commands for the hardware, and discovered that I was not setting a semi-undocumented bit (not listed in my main reference, but listed in nullDC source as group_en). The KOS PVR driver quietly set this bit without me realizing it, but my library did not. It seems not setting this bit was causing the TA to ignore my request to use full substrips and it would instead process the strip as single triangles. (I discovered this while writing a new PVR driver, and was wondering why vertex data was taking up so much more RAM and I was getting worse performance than I expected.)

The new best fake polygon count I've gotten is 11.96 million polys/sec, or 382 MB/s of vertex data. More what I was expecting.
 
Hello dudes, happy new year!! Long time without moving this thread!!! Hope you guys and your family are doing it well through this Covid horrible stuff....The thing is, i don´t know if you guys are aware of (probably yes), but Dreamcast is receiving new games, due to the massive Atomiswave porting extravaganza coming from Megavolt85 on the DC talk forums. We finally have on DC 3D games like Faster Than Speed, Maximum Speed, Demolish Fists, Genju and specially Force Five, that looks like make good use of DC hardware and bring us an idea of how DC games would have look after its demise....so..is there any chance you guys can provide us data about polycounts in this "new" Dreamcast games?? Thank you in advance!!! Cheers from Colombia, South América!!!
 
Well still playing around withthe naomilib tools. Messing in sports jam dreamcast. I got the master of ceremonies model for both his announcer role and gameplay. His announcer mesh is extremely detailed 10,754 triangles while his gameplay mesh is,2,186 triangles, very efficient modeling that keeps his look consistent with the higher poly model. Noy 18k as was reported before, that was probably an emulator rip.

Gameplay:
Dcsportsjam2.jpg


Announcer:
Dcsportsjam.jpg
 
For anyone whose interested, I just found a flaw in my benchmark. I was using a custom library to generate commands for the hardware, and discovered that I was not setting a semi-undocumented bit (not listed in my main reference, but listed in nullDC source as group_en). The KOS PVR driver quietly set this bit without me realizing it, but my library did not. It seems not setting this bit was causing the TA to ignore my request to use full substrips and it would instead process the strip as single triangles. (I discovered this while writing a new PVR driver, and was wondering why vertex data was taking up so much more RAM and I was getting worse performance than I expected.)

The new best fake polygon count I've gotten is 11.96 million polys/sec, or 382 MB/s of vertex data. More what I was expecting.

I know your more of a r&d type of guy and that these test don't really display anything (meant as raw benchmarks) and have released code/tools to to help with dc.will you ever show off the fruit of your of labor maybe in a tech demo of any sort. Always been curious if you would ever construct a visual representation of what you have achieved.
 
I know your more of a r&d type of guy and that these test don't really display anything (meant as raw benchmarks) and have released code/tools to to help with dc.will you ever show off the fruit of your of labor maybe in a tech demo of any sort. Always been curious if you would ever construct a visual representation of what you have achieved.
I'm not doing these measurements for nothing, I'm planning to release stuff. My end goal is to make a game (a platformer, similar to the no-FLUDD stages from Mario Sunshine), and most of what I'm doing is working towards that.

At this moment, I'm working on three things for the Dreamcast: a new PVR driver, a C interpreter, and a port of Micropolis (SimCity Classic).

The new PVR driver has several improvements over the KOS driver:

- Better performance metrics. KOS lists a couple stats (in integer milliseconds, so the precision is low), my driver gives a list of events in nanoseconds (relative to last page flip) so it's possible to see exactly when and how long things like renders, DMA, vertex submission, etc happened.

- Basic draw commands (lines, rectangles, monospace text)

- Basic model rendering, with a converter based on the Open Asset Importer.

- KOS's render-to-texture only supports framebuffer sized textures, my driver supports any size. It also has better performance with back-to-back R2T (for things like blurs). The performance increase is from avoiding a stall caused by double buffering the scene data.

If you want to do something like bloom, you need multiple R2Ts (create the texture containing the bright areas, a couple blur passes, then combine with the regular framebuffer). Normally, the PVR has two buffers to store scene data, but with back-to-back R2T you can get into a situation where the PVR is rendering the first buffer, the second buffer is full with the next render, but the CPU is ready to send a third scene (or more). In this case, the CPU would have to stall until a buffer frees up. My driver allows you to combine multiple renders in a single buffer, as well as have more than two buffers. So instead of each render consuming its own buffer, you could combine all renders for a single frame into one buffer, or you could pregenerate individual scene buffers for the blur passes and reuse them between frames.

- List redirection and tile multipass. The PVR has reads separate lists for modifier volumes for opaque and transparent polygons; normally if you want the same volumes to affect both, you have to submit the polygons twice. The driver allows the list for one set to point to the other.

When the PVR renders a tile, it normally draws all the opaque and alpha-tested polygons, then the transparent polygons, and writes it out to the framebuffer. Tile multipass lets you render multiple lists of opaque and transparent polygons, while retaining the existing color and depth buffers, before writing to the framebuffer. One thing this allows is mixing order-independent transparency and presorted transparency, to reduce the overhead of having many levels of per-pixel sorting.

Probably the most useful thing it can do is mid-render depth clearing by drawing transparent opaque polygons set to always pass the depth test. Yes, transparent opaque; opaque on the PVR means “draw only the visible pixel”, blending still works and will blend onto whatever was already in the internal color buffer. (Try to guess what happens if you use transparency in the first opaque pass.) The obvious uses for clearing the depth buffer mid-frame would be to prevent the player’s gun from clipping into the map in an FPS, or avoid depth precision issues with a flight simulator’s landscape and the cockpit.

The PVR’s write-opaque-pixels-once approach to rendering also allows for very efficient OGL accumulation buffer/3dfx t-buffer effects, to implement antialiasing, motion blur, and depth-of-field. For a four pass scene, draw the first opaque pass at 25% brightness, then draw additional 25% brightness opaque passes with additive blending turned on. (Alternatively, you can draw the first pass normally, then draw additional passes with regular lerp alpha blending, reducing the alpha each pass.) There is zero additional cost for combining the passes this way, but correctly combining actual transparent polygons is tricky/impossible depending the method used and blend mode. You could also do anaglyphs with this.

List redirection and tile multipass can be combined to allow single submit dual textured polygons. The PVR has a single TMU and does not have a multitexture vertex format. It is possible to specify a pair of textures and UVs/color with “affected by modifer volume” polygons, but only one set is drawn, depending on whether the pixel is inside a modifier volume or not. By settings up two passes and using list redirection, it’s possible to get the modifier mode vertex format to work as a dual texture format. The CPU only has to write the data once, and the scene buffer only stores one copy of the vertex positions. The first pass doesn’t have any modifier volumes, so everything gets drawn once with the outside-volume settings. The second pass opaque list points to the same data from the first pass, with a full screen modifier polygon so everything gets redrawn with inside-volume settings. Set the depth compare to be >=, so that things get drawn a second time. To mix in single texture polygons, set the depth compare to ==, and you won’t waste fillrate on the second pass.

I think there are some other things you can do with tile multipass and modifier volumes, but I haven’t tested that and don’t know for sure if the PVR works in a way that makes it possible.

- Better render state management. With KOS, it's impossible to change global settings like fog color or palettes without potentially causing rendering glitches. My driver buffers changes and applies them in between renders. KOS’s functions for handling per strip settings are very inefficient. You give the KOS driver one giant struct with all per strip settings and have a function go through the it and pack it into the PVR’s format. One minor change requires reprocessing and packing everything else too. My driver gives you a bunch of functions to manipulate the PVR command directly. They’re designed as inline functions so that the compiler can optimize and combine changes.

- OpenGL style texture management, which allows the driver to do video memory defragmentation (KOS just works with raw pointers and the allocator can't defragment). Setting the texture with this is much faster than KOS’s giant function; depending on cache misses, it should only take 15-40 cycles. This texture management isn't mandatory, you can still do KOS style raw pointers.

- More flexible framebuffer support. It has support for 24/32 bit color framebuffers. You can render to a window of a frame buffer, to do pixel scissoring. Support for dynamic resolutions by adjusting supersampling and vertical scaling per frame. I plan to add triple/quadruple buffering (with the way the video display hardware reads the framebuffer, you are basically forced to allocate framebuffers in pairs; R2T does not have this limitation). I want to see if I can get strip buffers working, which renders the screen in sync with the video out to avoid require storing the entire frame buffer in memory, similar to the Nintendo DS or certain sprite based systems.

There's several other miscellaneous changes, but those are probably the most interesting ones.

The driver won't really affect rendering performance (render-to-texture and dual texture mode aside) as that depends on T&L code quality. The basic rendering code included should be better than most of what's out there, though.

When I release the driver, I plan to have examples, but I’m not sure about any demoscene-style demo. Maybe?

The C interpreter is for scripting and faster development. It's to replace a Forth interpreter I had created. Being able to try out code without having to shut down the game, recompile, and reload it is great. There are some existing C interpreters, but none of them did everything I wanted: compile to position independent bytecode, good preprocessor support (I want protothreads to work), and low memory usage (with no risk of fragmentation). I’m basing the bytecode off the Forth interpreter, with some changes to handle the different coding style better. The bytecode can easily be embedded into level data. Since the script sources are C, there’s also the option to give the finished code to GCC and bake it into the executable for greater speed. One feature I want to add is to be able to run the interpreter on the host, feed it all the headers for the game engine, and have it automatically generate the code required to hook everything up (structs, #defines, global vars., function defs.) into the in-game interpreter.

I'm also working on a port of Micropolis, the open source version of the original SimCity, to the Dreamcast. I started it years ago, but I recently decided I was going to finish it. The original SimCity is kind of basic compared to its sequels, so I was kind of worried that the port would be forgettable, but I came up with a hook: split screen multiplayer, with either cooperative building or a competitive race to see who gets the best score in a certain amount of time (or beat a scenario first).

Right now, what I’m actively working on is the preprocessor for the C interpreter. Macro expansion works, and I almost have #ifs working. Once I get the C preprocessor finished, I was planning to go back to focusing on Micropolis and finishing that, but after writing this I’m thinking I should finish the driver first.
 
Using naomilib to probe into dreamcast f355 challenge.

Dreamcast/Naomi - Ferrari F355 challenge - 1999

Player car - 2,475 triangles (no second set of tail lights or tires)
f355.jpg


Cpu car(highest lod) - 1,872 triangles
f3551.jpg


Intro cut scene car - 3,907 triangles.
f3553.jpg


Gameplay tire - 156 triangles
f3552.jpg


intro cutscene tire - 480 triangles
f3554.jpg
 
I also played around with the Naomilib model ripping stuff recently. It's not mentioned on the site, but it also works on Daytona USA 2001 and the Virtua Fighter 4 Passport disc (no character models, just some cosmetic items displayed during load screens).

I don't have screenshots right now, but for Daytona USA, the arcade easy track was around 8500 tris. Around 1K were used for skid marks on the track. Around 28K tris were used for the medium track, and 38K tris for the hard arcade track. This is for the static geometry, and doesn't include animated props, like the slot machine in the easy track.

Figuring out the poly count of the Hornet car was tricky, since the file contained several models to handle damage and cockpit views, but around 830 tris for the undamaged body and interior, and 160 tris per tire. This doesn't include polygons used for glass or decals.

The polygon count of both Crazy Taxi maps are around 202K triangles. Crazy Taxi 2's maps have lower polygon counts, at 123K tris for the first map (the one with the bridges), and 166K for the second map. Most buildings don't have roofs, but some of Crazy Taxi 2's buildings do in one area of the second map, even though the camera never goes that high. Maybe the dev team split the map work between people, and someone didn't delete the roofs on their part?

It was a pain to get the second CT2 map to load in Blender. I was using a script to import all the little model files (more than 700) that the ripper generated, but Blender would keep crashing during the import. Splitting it up into 100 model batches allowed everything to import correctly.
 
I also played around with the Naomilib model ripping stuff recently. It's not mentioned on the site, but it also works on Daytona USA 2001 and the Virtua Fighter 4 Passport disc (no character models, just some cosmetic items displayed during load screens).

I don't have screenshots right now, but for Daytona USA, the arcade easy track was around 8500 tris. Around 1K were used for skid marks on the track. Around 28K tris were used for the medium track, and 38K tris for the hard arcade track. This is for the static geometry, and doesn't include animated props, like the slot machine in the easy track.

Figuring out the poly count of the Hornet car was tricky, since the file contained several models to handle damage and cockpit views, but around 830 tris for the undamaged body and interior, and 160 tris per tire. This doesn't include polygons used for glass or decals.

The polygon count of both Crazy Taxi maps are around 202K triangles. Crazy Taxi 2's maps have lower polygon counts, at 123K tris for the first map (the one with the bridges), and 166K for the second map. Most buildings don't have roofs, but some of Crazy Taxi 2's buildings do in one area of the second map, even though the camera never goes that high. Maybe the dev team split the map work between people, and someone didn't delete the roofs on their part?

It was a pain to get the second CT2 map to load in Blender. I was using a script to import all the little model files (more than 700) that the ripper generated, but Blender would keep crashing during the import. Splitting it up into 100 model batches allowed everything to import correctly.

I made the author aware of that, as well as ah my godess but i dont think he ever updated it. Ah my godess the characters are like 4k to 6k triangles. Just the torso and the head is like 3k triangles. The backgrounds seem to range from 3k to 10k( so far ive seen). Its hard to get the characters because this game uses alot of key frame animation so theres alot of repeating meshes.
 
I also played around with the Naomilib model ripping stuff recently. It's not mentioned on the site, but it also works on Daytona USA 2001 and the Virtua Fighter 4 Passport disc (no character models, just some cosmetic items displayed during load screens).

I don't have screenshots right now, but for Daytona USA, the arcade easy track was around 8500 tris. Around 1K were used for skid marks on the track. Around 28K tris were used for the medium track, and 38K tris for the hard arcade track. This is for the static geometry, and doesn't include animated props, like the slot machine in the easy track.

Figuring out the poly count of the Hornet car was tricky, since the file contained several models to handle damage and cockpit views, but around 830 tris for the undamaged body and interior, and 160 tris per tire. This doesn't include polygons used for glass or decals.

The polygon count of both Crazy Taxi maps are around 202K triangles. Crazy Taxi 2's maps have lower polygon counts, at 123K tris for the first map (the one with the bridges), and 166K for the second map. Most buildings don't have roofs, but some of Crazy Taxi 2's buildings do in one area of the second map, even though the camera never goes that high. Maybe the dev team split the map work between people, and someone didn't delete the roofs on their part?

It was a pain to get the second CT2 map to load in Blender. I was using a script to import all the little model files (more than 700) that the ripper generated, but Blender would keep crashing during the import. Splitting it up into 100 model batches allowed everything to import correctly.

I forgot to mention cyber angel mahjong, virtua striker 2 uses it as well. I dont think those are listed too.
 
Industrial Spy - Operation Espionage - Dreamcast. Gave looks very blocky but thats probably because the game does like 3 to 4 view ports simultaneous.

Main character 1 - 606 triangles
ispy3.jpg


Main character 2 - 611 triangles
ispy4.jpg


Main character 3 - 545 triangles
ispy5.jpg


Room 1 - 2046 triangles
ispy1.jpg


Room 2 - 2,754 triangles
ispy2.jpg
 
Battle beaster for the dreamcast. The game doesnt use shadow volumes insteads just makes an exact copy of the monster mesh and squishes. So basically 2x monster mesh.


Battle Beaster - Dreamcast

Dragon Beaster- 2,518 triangles
beaster01.jpg


sword beaster - 3,088 triangles
beaster02.jpg


flying beaster - 2,656 triangles
beaster03.jpg


Stage water top - 1,798 triangles
beaster04.jpg


Stage water reflection - 1,315 + top 1,798 = 3,113 triangles
beaster05.jpg


Tech city stage - 3,100 triangles
beaster06.jpg
 
  • Like
Reactions: snc
Carrier - dreamcast (cant seem to find cutscene models or bosses)




Ship - 7,939 triangles
carrier01.jpg


air crafts on top carrier - 5,852 triangles
carrier02.jpg


random hallway no floor - 936 triangles
carrier03.jpg


Ingles gameplay model - 1,860 triangles
carrier04.jpg


regular enemy - 1,225 triangles
carrier05.jpg
 
Back
Top