Wednesday, December 16, 2009

Tuesday, December 15, 2009

Updated JointPin and new BodyWater

Updated JointPin allows to directly attach BodyCloth to BodyRigid. This type of joint performs coordinates synchronization between the skinned mesh geometry and the cloth. The attached cloth adheres to the skinned mesh object without any undesired clearance:

New BodyWater physical object provides two-way interaction with BodyRigid. The performance is simply great:

Tuesday, December 1, 2009

Sunday, November 15, 2009

Tuesday, November 10, 2009

Saturday, November 7, 2009


1/3 of the team have caught flu. It seems that there is a real epidemy in Siberia. I hope we'll recover next week, because there are a lot of interesting things to do!

Physics cloth

Sunday, October 4, 2009

Bunch of new OpenGL extensions.

We can use signed normalmap textures with ARB_texture_snorm and ARB_texture_compression_rgtc extensions. No more ugly "*2.0-1.0" in shaders for DX10 level cards, but we should do it for legacy cards.

ARB_texture_multisample allows us to implement multisampled deferred effects such as light scattering and SSAO.

ARB_draw_elements_base_vertex great-great-great, but why only now?

Wednesday, September 30, 2009

inline vs __forceinline

Don't ask compiler to do something. Force it!



DirectX 11 tessellation samples

In the DirectX 11: Tessellation in Stalker: CoP, Dirt 2, Unigine and Alien vs. Predator article people mentioned that only our art sample really utilizes tessellation capabilities to improve image quality: "Only one that was a visually significant improvement was the displacement mapping on the roof. That should be a nice improvement over the various surface mapping techniques, bump, normal, POM, etc. that don't do nearly as good a job."

All hail our artists, who created that art asset! By the way, stay tuned for much more.

Monday, September 21, 2009

Fried meshes

* [20090930] Values for HD4870 and Direct3D11 are updated (it was a debug runtime:(

Huge crowd rendering can be accelerated by baking skinned meshes into static meshes in runtime. But there is no easy way to do it because of API and hardware limitations.

The scene consist of 49 characters and each character is rendered 6 times. Tables contain millions of polygons per second. There are no tests for low-level cards. But on such cards performance gain is very substantial. And there are no tests for OpenCL because of incomplete drivers.

The first two rows describe direct rendering of skinned meshes:
"Raw" is a single mesh per draw call.
"Inst" is multiple meshes per draw call.

The other rows describe different backing techniques:
"Raw" corresponds to backing single character per call between characters rendering.
"Inst" corresponds to backing 32 characters per call before characters rendering.

PBO: works well on all cards but instancing is required.
FeedBack: requires DX10 level card and doesn't work on ATI cards now.
CUDA: requires NVIDIA DX10 level card. Also instancing is very important.

R2VB: is ok on ATI and NV40. But we can't use this technique with NVIDIA DX10 cards.
CUDA: same as CUDA under OpenGL.

StreamOut: there is absolutely no problem with this technique.
CUDA: same as CUDA under OpenGL.

StreamOut: same as StreamOut under Direct3D10.
DirectCompute: instancing is also very important on NVIDIA hardware.

Sunday, September 13, 2009

GDC Europe 2009

Some photos from our trip to GDC Europe 2009 and Gamescom, without lectures shots (clickable):

The route was Tomsk-Novosibirsk-Moscow-Munich-Cologne-Munich-Moscow-Novosibirsk-Tomsk, something about 10000 kilometers.

Tuesday, September 8, 2009

Ambient occlusion mk2.

Awesome ambient occlusion mk2.
* Improved emitter/receiver interaction.

Thursday, September 3, 2009

HDR pipeline

New shaft flare post effect.

Saturday, August 22, 2009

Middleware in games

There is a good article in the August issue of Game Developer Magazine about middleware, here is a quote from there:

"It's long been appreciated that using game engines and middleware libraries can get the team up and running more quickly on the target platform during the development process, allowing artists and designers to mock up the game much earlier. Commenters noted, "While middleware is not perfect, it allows us to concentrate on the areas that really make our game different, rather than implement basics. But programmers tend to not like [middleware] because it makes their lives more difficult [and the naive ones think they can do it better]."

Friday, August 7, 2009

CPU Caches 2

To achieve maximum performance of multi-threaded application you should run same jobs on same threads (CPU's). It's very important for applications based on small thread jobs.

Thursday, August 6, 2009

Physics status

Performance and stability of physics is much improved and it's not a final result:)

State of all physical objects can be stored into the special buffers. In this demos this buffers are used for time wrapping effect:

This is a heap of joints:

And funny stuff with homuncles:)

Saturday, August 1, 2009


Average timetable of last week:

18:00 home power on
19:00 office work on
11:00 office work off
11:30 home power off

Tuesday, July 28, 2009

Recent photo of the crew

From left to right:
* Frustum (Alexander Zaprjagaev) // CTO and The Brain
* Andrewko (Andrey Kolchin) // 3D artist
* Silvero (Iliya Abzaev) // developer
* ANet (Anna Ishina) // developer
* FadeToBlack (Alexey Egorov) // developer
* Silen (Vitaliy Sidorov) // game designer
* TmifX (Ivan Gulyaev) // developer
* Binstream (Denis Shergin) // CEO
* Pluton (Andrey Kushner) // lead 3D artist
* Brrrrr (Stanislav Zagniy) // 3D artist
* Manguste (Nadezhda Ovchinnikova) // technical writer

Missing on the photo: Jane (Eugenia Shergina), JL (Eugeniy Logvinov), Paralyzah (Michael Kondratyev).

PS: It was the opening night of "Harry Potter and the Half-Blood Prince" in Tomsk.
PPS: Siberian summer can be hot! but short as well :(

Tuesday, July 21, 2009

New script feature

Expression e0 = new Expression("133.0 * 133.0");

Expression e1 = new Expression("{
int a,b,c,d;
return a + b + c + d;

Expression e2 = new Expression("{
string name;
File file = new File(name,\"rb\");
int size = file.getSize();
delete file;
return size;

float: 17689
int: 10
int: 36339

Thursday, July 9, 2009


Don't provide tessellation for 3D artists, because the work will stop :)

Normal mapping:

Normal mapping + displacement:

Normal mapping + displacement wireframe:

Here is the video:

PS: The feature will be available in DirectX 11.

Saturday, July 4, 2009

Thursday, July 2, 2009

Unigine goes PS3

We made it, Unigine joined Tools & Middleware License Program for PLAYSTATION®3.

The process took 8 months to complete, it was kinda hard. Now we're going to get devkits and make the porting!

CPU Caches

Sometimes absolutely correct code can produces huge stalls because of cache misses.
For example if we have two 3D arrays: source ([128][128][16]) and destination ([16][128][128]) and we should copy data from source to destination.
Ordinary copying spends 5.0ms on old Athlon64 X2 3800+ CPU in this case.
But if we create a temporary copy array ([16][129][129]) and perform copying of data two times (from source to copy and from copy to destination), so copying time is only 1.9ms.

Thursday, May 14, 2009

Pretty matrix trick

Floating point numbers are wonderful things.
Let's try to draw a distant mesh by standard approach.

Engine code:
shader_modelviewprojection = player_projection * player_modelview;

Vertex shader:
gl_Position = shader_modelviewprojection * vertex;

The result will be funny:

And it's time to trick now.

Engine code:
shader_offset = player_position;
shader_modelviewprojection = player_projection * player_modelview * translate(shader_offset);

Vertex shader:
gl_Position = shader_modelviewprojection * (vertex - shader_offset);

The result will be absolutely correct:

Thursday, May 7, 2009 domain name is officially dead.

Wednesday, April 29, 2009

Screenshots Buzz

Recently we have shown a bunch of screenshots from our forthcoming game, which created some buzz. Linux users are especially enthusiastic about the fact that the project will natively support both Windows and Linux (thanks to Michael Larabel for posting news item on Phoronix website).

The bad thing is that we still don't know even a genre of our game %) In fact, we intended to make a large tech-demo, but eventually we came up to the small game idea. According to the first feedback users expect the project to deliver fun, so it's kinda complicated situation for us. Well, it seems that we have no other option than to make a full-featured game =)

PS: Another fun thing is that the news were translated into Russian and copied several times by different sites and blogs, so in the end overall data distortion was so severe that a reader can get to know about "unique feature of the project: unlimited multiplayer!", while there was no single word with "net" in the original entry.

More to come, stay tuned!

Sunday, April 26, 2009

stdlib performance

This is a relative performance of some standard library function.
String::atoi() and String::atof() are Unigine functions.

Windows (Core2 Quad 2400MHz):
atoiTime: 0.276FPS: 3.6231
strtolTime: 0.278FPS: 3.6001
String::atoiTime: 0.095FPS: 10.4853
atofTime: 2.104FPS: 0.4752
strtodTime: 2.127FPS: 0.4701
String::atofTime: 0.349FPS: 2.8644

Linux (Athlon 64 X2 2140MHz):
atoiTime: 0.271FPS: 3.6840
strtolTime: 0.301FPS: 3.3271
String::atoiTime: 0.112FPS: 8.9447
atofTime: 1.337FPS: 0.7480
strtodTime: 1.224FPS: 0.8168
String::atofTime: 0.328FPS: 3.0481

Friday, April 24, 2009

Hall of GPUs killed by Unigine

NVIDIA 8800GTX is dead because of memory problems
NVIDIA 9800GT is dead because of memory problems

Friday, April 17, 2009

Sunday, April 12, 2009

Magic Spring

Now we have a magic spring in our studio:

Thursday, April 9, 2009

Cubemap filtering

All Direct3D10-compatible cards use linear filtering across cube map faces.
NVIDIA NV50 uses linear filtering across cube map faces under OpenGL for 6-9 months.
ATI R700 uses linear filtering across cube map faces under Direct3D9 since Catalyst 7.1 or 7.2.

Who is next?

Saturday, March 28, 2009

Total happiness

No more gypsum anymore. It was nightmare 20 days without ability to walk, to run, to ride... Right leg is little smaller than left one and it's funny :) I made a crack in splint bone 5 weeks ago by snowboard boot. Doctors said that I had closed wound only. I had been walking with crack in bone for 2 weeks. And after that I broke it totally. Now I can use my leg and it's happiness. Thanks for all Russian doctors :)

Monday, March 23, 2009

Paralyzah: 30 Years

Yesterday we celebrated 30th anniversary of our musician, Michael "Paralyzah" Kondratyev. At the moment his tracks are released by the following labels: Respect Rec (Russia), Total Advance Music (Russia), KDK Rec (Russia), Gunsta Rec (Russia), MacroVision (Russia), Covert Operations (USA). He creates music mainly in drum'n'bass style, plus he is a DJ and promoter of "Untrace" promo-group. All soundtracks of our demos were written by him, you can check out some other tracks here:

Happy birthday, man!

Friday, March 20, 2009

Hi Everyone,

Years ago I had website and I frequently posted demos. But years ago I totally switched into Unigine project also. And once I forgot to made payment for the domain name. Currently is a dead site, but you can have access to it at address. I hope the situation with domain name will be resolved and will be alive as soon as possible.

Three weeks ago I started work on dynamical backed into the vertex buffer skinned meshes to reduce amount of vertex shaders in Unigine. Unfortunately two weeks ago I had broken my leg :) So this interesting task is unfinished now and I will report results when I will work in the office, because at home I have only a Linux based PC.

How can we use uniform scaling with dual quaternions? It's simple. First quaternion in the pair is normalized one and we can scale it on decomposing stage. And on composing we can easily calculate quaternion magnitude and it will be its own scaling.

And now I can't ride snowboard :(

Monday, March 16, 2009

Next Stage

Suddenly I realized that our company (Unigine Corp.) has passed the startup stage. We are a good team working on the project for years, we have good customers, we have our main product constantly improving on schedule, so things seems to be changed to steady growth. Well, that's all for good, lets keep on moving forward.