Sine Mora technical post mortem(ish)

reptile

Newcomer
Hey everyone,

i was going to write a technical post-mortem on our shooter, Sine Mora, but i just can't motivate myself enough to learn powerpoint, so i thought, hey, why not just post it on beyond3d, maybe someone will find it useful/interesting... so here it is.

Sine Mora is basically a shoot'em'up, in the tradition of Einhander, or R-Type. From a technical point of view, there were two things i was trying to make sure that make it into the game: solid 60fps and good image quality. The final game manages to maintain 60fps all the time except two occassions, unfortunately - we fell victim to regression and nobody noticed it until it was late - sorry :( (some cutscenes also drop frames, but they weren't considered important from a gameplay point of view)

The game is using forward rendering, mainly because i didn't want to give up hardware MSAA, and i just couldn't figure out a way to do it deferred in the 16ms allowed. Each objects has one main light (spot or directional) and a maximum of 8 point lights attached. Main lights also use a pretty standard PCF shadowmap - no big tricks here, directional shadows are frustum focused, with a distance of 800 units, fading out in the domain of 600-800. There are about 5-6 different materials in the game, each using an average of 2-3 textures, all of them DXT1/5. Distant objects switch to a simpler material with no crossfade - usually they're far enough for it to be completely unnoticable.

Sine Mora is rendered at 1280x544x4AA, with black bars on the top/bottom of the screen. This was a design decision to make it more cinematic. Aniso4x is used on most textures. Rendering order is something like this:

- Shadows are rendered into a 1024x1024 shadowmap.

- Reflections are rendered into a 640x272x0AA target, using oblique frustum clipping.

- The main opaque scene is rendered into a 1280x544x4AA target, the destination alpha is used to indicate pixels which are "important". Important pixels are not blurred when slomo is on.

- Transparent objects are rendered, still using the render target from the previous step.

- The zbuffer gets downscaled, storing its min/max values into a 640x272 target.

- Half-res (or quarter res, depends on how you look at it :)) particles are rendered into a 640x272 target, using the downscaled min/max zbuffer to better approximate the high-res target. Fading is calculated for both values, and then averaged.

- Color & zbuffer gets reloaded into a 1280x544x0AA target, and the half res soft-particle buffer is upscaled on top of it, using FXAA. FXAA was much faster and better looking, then any bilateral upscale i've tried.. maybe i just didn't try hard enough :)

- Foreground transparencies are rendered, now this is an interesting step, because we've already lost AA at this point, but there are so few foreground draw calls, apart from bullets, that it's really not that noticable.

- The final target is resolved into a half-res buffer, using the alias-as-msaa hack, and then blurred. This blurred buffer is then used by the compositing shader for either a simple bloom, or to separate the background in slomo/boss intro modes. As a bonus, if the art filter is on, two volume textures are used to transform the final colour values into the first and second best matching entries of the C64 palette. (and no, i didn't use the vice palette as a reference :D )

- And finally, the GUI is rendered.

Average triangle count is 400.000-500.000, which is not a very relevant metric, but sounds good :) In stereoscopic 3D, some compromises had to be made to maintain the holy 60fps :) AA is reduced to 2x, and the horizontal resolution is halved. This does NOT apply to the GUI, which is still rendered in full resolution, even in 3D.

Because the game has a strong reliance on time manipulation (read: slooowmoo), all particle movements are scaled by current game speed. This also means, that animated textures (which we use a LOT) have to be blended too - all texture anim particles in the game fetch two texels (current frame vs next frame) and blend between them. Rewinding time required us to store game state every 4 frames, including particle data, and we play it back by restoring the newest frame and advancing the game by N frames, where N is 0..3. (to avoid jerky rewind - you can still spot some objects not rewinding as smoothly!)

So there it is... i hope some of you will find it an interesting read.
 
AlStrong: thanks:)

Gitaroo: i cant comment on that :( but in the spirit of my original post, if it did, it would be using the SPUs to run some custom code for frustum/backface culling per-triangle, and for the FFT water surface simulation.
 
I bought your game on day 1 and its definitely the most high end shumps I have seen and enjoy it a lot. Only problem I have is its sometime its hard to see the bullets and the enemies, I think some reviews have touched on that. If you look at some other 2D shumps from cave, you distinguish between the background, bullets and enemies easily or 3D shumps like Ikaruga with fog. Thanks for the reply though, hope to see more games from you guys. Maybe some Vita support would be nice....
 
Thanks for the topic reptile.
I didn't even know about the game, but will at least try the trial and maybe even purchase.
I used to love these type of games when I was much younger.

Good luck on getting the word out and hopefully a successful release.
 
Thanks !
I was really suprised how good this game looks,really clean looking game and the art is just amazing.
 
Thank you for your post reptile, I purchased the game day one and love it (schmups are my favorite genre). I heard the game is struggling here in the US but hopefully word gets out and more people will buy it. Will the game be updated to address those minor slowdown issues at some point (not that I have seen any yet, to be honest with you)?

How is the game doing in Japan?
 
I'm another one that would like to thank you for that interesting and insightful post.

Unlike others here, I'm not a big fan of schmup, especially side-scrollers.. Even going back to Defender and Scramble I have just not been able to get along with them. And my most despised schmups of all? Bullet Hell Schmups.

And yet I bought Sine Mora day one.

Fuck me if it isn't just beautiful, with a rock-steady framerate meaning beautifully reactive controls.

I still die a lot and suspect that I'll never see the conclusion of the story, but I don't regret my purchase one little bit.
 
thanks for the post!!
I am going to buy this game today...didn't know about it, but love those type of games!! (Except the game "Blood Money", which I hate because of those flip your control input towers mid level :))
 
Hi reptile,

Great post...

Especially interested on the fact that you guys maintain such a low number of materials in the game?

I'm assuming you've taken the ubershader approach?

Can you comment briefly on what your 5-6 material are?

Also do you guys do static branch removal on those shaders or just absorb the cost of branching on the ALUs?
 
Thank you for the feedback guys!

Gitaroo: yeah the background separation issue is still there to a degree. we've tried a few things, and the current one was the best. not perfect, i know.

Molecular : i have no idea... but the number on the leaderboard screen doesn't make us happy :(

archangelmorph : the main material is actually quite simple, it has a diffuse, a normal, and a "mask" texture. (the mask texture has different things encoded in its r/g/b channels, like selfillum, and such). Then there's a "metal" version (just a fancy name - it's basically got a reflection cubemap added on top), and things like vegetation and light shafts have their own, simplified materials. There's no branching in the shaders at all, i compile up to 36 variations of a shader, so you could say, that it is indeed an ubershader approach. Maintaining 60fps required the shaders to be relatively simple - no big magic going on there, it's just the artists were amazingly good :)
 
archangelmorph : the main material is actually quite simple, it has a diffuse, a normal, and a "mask" texture. (the mask texture has different things encoded in its r/g/b channels, like selfillum, and such). Then there's a "metal" version (just a fancy name - it's basically got a reflection cubemap added on top), and things like vegetation and light shafts have their own, simplified materials.

We did something very similar to this back on Explodemon...

There's no branching in the shaders at all, i compile up to 36 variations of a shader, so you could say, that it is indeed an ubershader approach. Maintaining 60fps required the shaders to be relatively simple - no big magic going on there, it's just the artists were amazingly good :)

Definitely evident in the look of the game...

Really nice work dude...
 
Thanks for posting this, wasn't even aware of the game's existence...been busy with other stuff. Anyway I just bought it and it's currently downloading now..will be playing it tonight. There needs to be more advertising for these games. If it hadn't been for this thread I probably would've never known about it and would've never purchased it.
 
I played the demo and liked it. I will hit the purchase button tonight when I get home.

Good job and thanks for the post mortem/advertisement.
 
Bought this, played it a lot, really enjoy it. Although wow does it have the steepest difficulty curve for achievements!

Must play more...

Edit: Please make autofire faster. The fact that you can break the game with a turbocontroller and manual fire is a bit silly.
 
Last edited by a moderator:
Bought it last night and was surprised that the story played different than the demo. It seems that the demo was a snippet of the full game, but with different stages not in the same order.

Got to Chapter 2 before signing off for the night. Will play more tonight.
 
Back
Top