tag:blogger.com,1999:blog-47533358053578560162024-03-14T13:51:27.817+06:00Unigine crewfrustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.comBlogger92125tag:blogger.com,1999:blog-4753335805357856016.post-32583457298715438332014-09-16T19:28:00.000+07:002014-09-16T19:28:39.916+07:00::operator new[] overloading.Let's try to run Foo and Bar classes under ARM Linux platform:
<table bgcolor="#000000"><tr><td><p><pre><font color="#ffffff">
<font color="#80a0ff">// Foo class</font>
<font color="#60ff60"><b>class</b></font> Foo {
<font color="#ffff60"><b>public</b></font>:
Foo() { vec = my_value; }
float32x4_t vec;
};
<font color="#80a0ff">// Bar class</font>
<font color="#60ff60"><b>class</b></font> Bar {
<font color="#ffff60"><b>public</b></font>:
Bar() { vec = my_value; }
~Bar() { } <font color="#80a0ff">// this destructor is important</font>
float32x4_t vec;
};
<font color="#80a0ff">// </font><span style="background-color: #0d0d0d"><font color="#ffa0a0">16</font></span><font color="#80a0ff">-byte alignment allocation</font>
<font color="#80a0ff">// this approach will work on all platforms!</font>
<font color="#60ff60"><b>void</b></font> *<font color="#ffff60"><b>operator</b></font> <font color="#ffff60"><b>new</b></font>(<font color="#60ff60"><b>size_t</b></font> size) {
<font color="#ffff60"><b>return</b></font> memalign(<span style="background-color: #0d0d0d"><font color="#ffa0a0">16</font></span>,size);
}
<font color="#60ff60"><b>void</b></font> *<font color="#ffff60"><b>operator</b></font> <font color="#ffff60"><b>new</b></font>[](<font color="#60ff60"><b>size_t</b></font> size) {
<font color="#ffff60"><b>return</b></font> memalign(<span style="background-color: #0d0d0d"><font color="#ffa0a0">16</font></span>,size);
}
<font color="#80a0ff">// everything is OK...</font>
Foo *f0 = <font color="#ffff60"><b>new</b></font> Foo();
Bar *b0 = <font color="#ffff60"><b>new</b></font> Bar();
Foo *f1 = <font color="#ffff60"><b>new</b></font> Foo[<span style="background-color: #0d0d0d"><font color="#ffa0a0">1</font></span>];
<font color="#80a0ff">// Hello SIGBUS! where are you from?</font>
Bar *b1 = <font color="#ffff60"><b>new</b></font> Bar[<span style="background-color: #0d0d0d"><font color="#ffa0a0">1</font></span>];
<font color="#80a0ff">// I'm from </font><span style="background-color: #0d0d0d"><font color="#ffa0a0">8</font></span><font color="#80a0ff">-byte <a href="https://gcc.gnu.org/ml/libstdc++/2004-06/msg00364.html">cookie.</a></font>
</font></pre></p></td></tr></table>
The f1 pointer has 16-byte alignment. But b1 pointer has 8-byte alignment.
For a Bar class with non-default destructor compiler will save allocation size and class size inside the cookie.<br/>
The cookie size on non-__ARM_EABI__ platforms is max(sizeof(size_t) * 2,sizeof(Foo)).<br/>
The cookie size of __ARM_EABI__ platform is sizeof(size_t) * 2 and we can't change it.<br/>
<br />
We you should do with all your code which is using this approach on __ARB_EABI__??<br />
The stupid straightforward solution is to return the wrong 8-byte alignment instead of 16-byte one for all Bar classes:
<table bgcolor="#000000"><tr><td><p><pre><font color="#ffffff">
<font color="#60ff60"><b>void</b></font> *<font color="#ffff60"><b>operator</b></font> <font color="#ffff60"><b>new</b></font>[](<font color="#60ff60"><b>size_t</b></font> size) {
<font color="#ff80ff"> #if defined(_LINUX) && defined(__ARM_EABI__)</font>
<font color="#ffff60"><b>if</b></font>(<font color="#ffff60"><b>sizeof</b></font>(<font color="#60ff60"><b>size_t</b></font>) == <span style="background-color: #0d0d0d"><font color="#ffa0a0">4</font></span> && !IS_ALIGNED16(size)) {
size += <font color="#ffff60"><b>sizeof</b></font>(<font color="#60ff60"><b>size_t</b></font>) * <span style="background-color: #0d0d0d"><font color="#ffa0a0">2</font></span>;
<font color="#ffff60"><b>return</b></font> <font color="#ffff60"><b>static_cast</b></font><<font color="#60ff60"><b>size_t</b></font>*>(memalign(<span style="background-color: #0d0d0d"><font color="#ffa0a0">16</font></span>,size)) + <span style="background-color: #0d0d0d"><font color="#ffa0a0">2</font></span>;
}
<font color="#ff80ff"> #endif</font>
<font color="#ffff60"><b>return</b></font> memalign(<span style="background-color: #0d0d0d"><font color="#ffa0a0">16</font></span>,size);
}
<font color="#60ff60"><b>void</b></font> <font color="#ffff60"><b>operator</b></font> <font color="#ffff60"><b>delete</b></font>(<font color="#60ff60"><b>void</b></font> *ptr) {
<font color="#ff80ff"> #if defined(_LINUX) && defined(__ARM_EABI__)</font>
<font color="#ffff60"><b>if</b></font>(<font color="#ffff60"><b>sizeof</b></font>(<font color="#60ff60"><b>size_t</b></font>) == <span style="background-color: #0d0d0d"><font color="#ffa0a0">4</font></span> && !IS_ALIGNED16(ptr)) {
<font color="#ffff60"><b>return</b></font> free(<font color="#ffff60"><b>static_cast</b></font><<font color="#60ff60"><b>size_t</b></font>*>(ptr) - <span style="background-color: #0d0d0d"><font color="#ffa0a0">2</font></span>);
}
<font color="#ff80ff"> #endif</font>
free(ptr);
}
</font></pre></p></td></tr></table>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com4tag:blogger.com,1999:blog-4753335805357856016.post-74750260030733505802013-06-17T18:45:00.000+07:002013-06-17T18:46:11.847+07:00Oculus Rift compatible video with Unigine benchmarks without DOF effect and correct FOV:
<iframe width="560" height="315" src="http://www.youtube.com/embed/iAZRVuatdlQ" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="http://www.youtube.com/embed/QDDC4Qgp8FE" frameborder="0" allowfullscreen></iframe>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com1tag:blogger.com,1999:blog-4753335805357856016.post-5178093922759679932013-06-16T13:53:00.000+07:002013-06-16T13:53:35.357+07:00Oculus Rift compatible video with Unigine benchmarks:
<iframe width="560" height="315" src="http://www.youtube.com/embed/X4fESaGLqTg" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="http://www.youtube.com/embed/knknfiBlcqo" frameborder="0" allowfullscreen></iframe>
frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com0tag:blogger.com,1999:blog-4753335805357856016.post-73952266915101821672013-02-21T18:59:00.000+07:002013-03-21T23:16:56.235+07:00Real-time 180-degree panorama rendering of new Unigine benchmarks:
<iframe width="560" height="315" src="http://www.youtube.com/embed/4yMnsioOpuo" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="http://www.youtube.com/embed/LyO2jy2I_4s" frameborder="0" allowfullscreen></iframe>
frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com1tag:blogger.com,1999:blog-4753335805357856016.post-13357505513914587712011-10-12T21:44:00.002+07:002011-10-12T22:02:29.615+07:00Valley demo previewWork in progress, upcoming demo of <a href="http://unigine.com/products/unigine/">Unigine engine</a>:<br /><iframe width="480" height="270" src="http://www.youtube.com/embed/-y4bJvFEtHI?fs=1" frameborder="0" allowFullScreen=""></iframe>binstreamhttp://www.blogger.com/profile/18137233638731708207noreply@blogger.com1tag:blogger.com,1999:blog-4753335805357856016.post-6826136461653942092011-09-09T19:14:00.004+07:002011-09-09T19:40:24.387+07:00Unigine crew linksWe are still unsure regarding the format of this blog, so you can track some stuff regarding Unigine crew in the following places for now:<br /><ul><br /><li>Frustum (Alexander Zaprjagaev, CTO and lead developer of Unigine engine): <a href="http://twitter.com/frustum">Twitter</a> (zero traffic, sorry - he is busy coding day and night)</li><br /><li>Binstream (Denis Shergin, CEO): <a href="http://twitter.com/binstream">Twitter</a> (Unigine projects, linux geekness, some management stuff), <a href="http://binstream.livejournal.com/">LiveJournal</a> (in Russian), <a href="http://www.facebook.com/binstream">Facebook</a></li><br /><li><a href="http://unigine.com/products/unigine/">Unigine Engine</a>: <a href="http://twitter.com/unigine">Twitter</a>, <a href="http://www.facebook.com/Unigine">Facebook</a>, <a href="http://unigine.com/devlog/">Development log</a></li><br /><li><a href="http://oilrush-game.com/">Oil Rush</a> (our upcoming naval strategy game): <a href="http://twitter.com/oilrush_game">Twitter</a>, <a href="http://www.facebook.com/OilRush">Facebook</a>, <a href="http://oilrush-game.com/forum/">Forum</a></li><br /></ul><br />PS: by the way, check out our new shiny website: <a href="http://unigine.com/">unigine.com</a>binstreamhttp://www.blogger.com/profile/18137233638731708207noreply@blogger.com0tag:blogger.com,1999:blog-4753335805357856016.post-32638416388407329722011-01-03T18:35:00.003+06:002011-01-03T19:46:58.572+06:00Global illumination IIThe previous post about <a href="http://http://unigine.blogspot.com/2010/10/global-illumination.html">Global Illumination</a> demonstrated a modification of real-time screen space ambient occlusion (SSDO) algorithm. This is a good post-processing effect for modern and powerful hardware. We use this approach in the new version of Heaven benchmark, which will be released soon. But low-level hardware still requires lightmaps...<br /><br />I have improved lightmap rendering in Unigine by using directional lightmaps. They can be easily calculated by the engine render pipeline (simple ray tracing). Unfortunately the result of directional lightmaps without environment or indirect lighting looks ugly. So I created a tool for indirect lighting calculation. Our approach is very simple: we use built-in LightProb (light source based on spherical harmonics) facilities to grab environment lighting:<br />* we generate a heap of LightProb objects all across the scene<br />* each LightProb grabs nearby lighting info<br />* indirect component from LightProbs is combined with direct one from ray tracing into the lightmap textures<br /><br />Performance of such global illumination solver is awesome. Calculation time for the shown scene (based on the old "Site" Unigine demo) is only 2-3 minutes on dual core PC. GPU power is also utilised during LightProb generation.<br /><br />Dynamic forward lights:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlVYJQ2NkLye-OBxXYqaNC4ggM5aTRK3-EbDT_CriRSXGYggMK3RJlRiVUBEntl0NrvfwETQiOtfYV4EGA_h1RyZTnhIamv0ypvLBejS7aEgyTBemnd21kYCJLziZZ1oufr0JBwIL8r2s/s1600/00000.jpg"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlVYJQ2NkLye-OBxXYqaNC4ggM5aTRK3-EbDT_CriRSXGYggMK3RJlRiVUBEntl0NrvfwETQiOtfYV4EGA_h1RyZTnhIamv0ypvLBejS7aEgyTBemnd21kYCJLziZZ1oufr0JBwIL8r2s/s400/00000.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5557938081690186146" /></a><br /><br />Backed lightmaps with direct term:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHUF7Jwh-V6YQIcXWYmeFa3cVEh0pWPp1PB8ay4Ay9oOScULTT3gBtnCxM7uIMZm1PJyjdeDBXVR68F2jZRk6RrXY7l41Vgoau2DbSVINWiMHyIh0nZTuKE42BBQFc6Kb5piHGMi2Y90U/s1600/00001.jpg"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHUF7Jwh-V6YQIcXWYmeFa3cVEh0pWPp1PB8ay4Ay9oOScULTT3gBtnCxM7uIMZm1PJyjdeDBXVR68F2jZRk6RrXY7l41Vgoau2DbSVINWiMHyIh0nZTuKE42BBQFc6Kb5piHGMi2Y90U/s400/00001.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5557938080972075762" /></a><br /><br />Backed lightmaps with direct and indirect terms:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiViLTTEIf-pgWzTtZ-0zoOAgFglKAYOvrkPHD-sSsAlQkAbBg6m4EaGcYMKIY_IZeDGniXGk6YcNnc28ibYHXKsa3zfY6l158-rPiK_Klq69TTNq_jgsMaFk_JrEzhm4JEaEz3LI63pJU/s1600/00002.jpg"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiViLTTEIf-pgWzTtZ-0zoOAgFglKAYOvrkPHD-sSsAlQkAbBg6m4EaGcYMKIY_IZeDGniXGk6YcNnc28ibYHXKsa3zfY6l158-rPiK_Klq69TTNq_jgsMaFk_JrEzhm4JEaEz3LI63pJU/s400/00002.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5557938075906222098" /></a><br /><br />Backed lightmaps with indirect term:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxAABdWrZ4N7BFcI6ZvvkTqR7aagZbaiN4UawRm4gUc7Yhb3l8X_W4MgRYx1q-PC_s9DXxp2OQCs8H4BkfSd83SOc_50LJxL5WmSqtHIZoZ_YOkTm0Pg5TSa1MyZ_JYUlAeNF3TB9mI8A/s1600/00003.jpg"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxAABdWrZ4N7BFcI6ZvvkTqR7aagZbaiN4UawRm4gUc7Yhb3l8X_W4MgRYx1q-PC_s9DXxp2OQCs8H4BkfSd83SOc_50LJxL5WmSqtHIZoZ_YOkTm0Pg5TSa1MyZ_JYUlAeNF3TB9mI8A/s400/00003.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5557938074633477858" /></a>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com3tag:blogger.com,1999:blog-4753335805357856016.post-55630210726754994892010-11-23T20:11:00.002+06:002010-11-23T20:22:43.715+06:00Continuous IntegrationWe use <a href="http://www.jetbrains.com/teamcity/">TeamCity</a> as a continuous integration server to build different configurations of Unigine engine, tools, SDKs and so on. We also use <a href="http://trac.edgewall.org/">Trac</a> as an issue tracker. The problem was lack of their native integration, but it's solved: Max wrote a <a href="http://trac-hacks.org/wiki/TeamcityPluginIntegration">TeamcityIntegration plugin</a>, feel free to use it.<br /><br />BTW, it takes about 5 minutes to make full rebuild of Unigine (engine+tools, both release and debug) on a Linux build node, while the Windows one (which has more powerful hardware) spends 12+ minutes for the same build type. So <a href="http://ccache.samba.org/">ccache</a> rules, we do miss it for Visual Studio.binstreamhttp://www.blogger.com/profile/18137233638731708207noreply@blogger.com4tag:blogger.com,1999:blog-4753335805357856016.post-53934241086865768902010-10-21T11:17:00.002+07:002010-10-21T11:18:28.683+07:00Global illumination<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgynlwABmgwRyBJgESeguJsHQ4nDvNE6HkbXQXYbDg7NjnHRC8NORW6WUkyAyMoFd2iu8sqgqMglYT7J0eMH75h1IUUuyHFw9d805yctqLssZ5PtwIUEl8zkamZFIKBEQpkJGsQbNzckfk/s1600/00001.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgynlwABmgwRyBJgESeguJsHQ4nDvNE6HkbXQXYbDg7NjnHRC8NORW6WUkyAyMoFd2iu8sqgqMglYT7J0eMH75h1IUUuyHFw9d805yctqLssZ5PtwIUEl8zkamZFIKBEQpkJGsQbNzckfk/s400/00001.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5530348796396102658" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7PkDH6iXd-hkhdC7JFfFm4AdIhPWzpcImqGHjxY7kPFxumyu-EJNZwvsdFgKxUcs6kNxYusB5YobwR1_mrLcFyzzEc185i1p_f2sZ0-kbXqVAr_k7rBHTOCrKfuIe9bq7fHrnoauPjj4/s1600/00002.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7PkDH6iXd-hkhdC7JFfFm4AdIhPWzpcImqGHjxY7kPFxumyu-EJNZwvsdFgKxUcs6kNxYusB5YobwR1_mrLcFyzzEc185i1p_f2sZ0-kbXqVAr_k7rBHTOCrKfuIe9bq7fHrnoauPjj4/s400/00002.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5530348808697404962" /></a>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com3tag:blogger.com,1999:blog-4753335805357856016.post-30665398386847446942010-09-30T14:16:00.002+07:002010-09-30T14:17:36.301+07:00Vegetation animation<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/GuN6FgtUEmw?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/GuN6FgtUEmw?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="258"></embed></object>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com1tag:blogger.com,1999:blog-4753335805357856016.post-88635899112851465212010-09-17T16:54:00.005+07:002010-09-17T17:26:06.927+07:00CUDA vs OpenCL vs SPU Part IVFinally I've got radix sort implementation which is working on AMD OpenCL. <a href="http://unigine.blogspot.com/2010/02/cuda-vs-opencl-vs-directcompute.html">This</a> is a link on previous sorting algorithms test. And now we have new more interesting results :) Time of GPU sorting includes time of data downloading from video memory. Sorted structure is single uint2 array for bitonic sort, and two int arrays for radix sort.<br /><br /><span style="font-weight:bold;">Elements 64768:</span><br /><br /><span style="font-weight:bold;">CUDA:</span><br /><br />GeForce 9600GT:<br />CUBitonic Time: 0.007 FPS: 140.5679 Mem: 69.46 Mb/s<br />CURadix Time: 0.003 FPS: 342.8180 Mem: 169.40 Mb/s<br /><br />GeForce GTX 260:<br />CUBitonic Time: 0.002 FPS: 403.5513 Mem: 199.41 Mb/s<br />CURadix Time: 0.001 FPS: 752.4454 Mem: 371.81 Mb/s<br /><br />GeForce GTX 480:<br />CUBitonic Time: 0.001 FPS: 966.1836 Mem: 477.43 Mb/s<br />CURadix Time: 0.001 FPS: 1398.6014 Mem: 691.11 Mb/s<br /><br /><span style="font-weight:bold;">OpenCL:</span><br /><br />GeForce 9600GT:<br />CLBitonic Time: 0.008 FPS: 126.9519 Mem: 62.73 Mb/s<br />CLRadix Time: 0.004 FPS: 252.9724 Mem: 125.00 Mb/s<br /><br />GeForce GTX 260:<br />CLBitonic Time: 0.004 FPS: 266.7378 Mem: 131.81 Mb/s<br />CLRadix Time: 0.003 FPS: 368.3241 Mem: 182.00 Mb/s<br /><br />GeForce GTX 480:<br />CLBitonic Time: 0.002 FPS: 579.3743 Mem: 286.29 Mb/s<br />CLRadix Time: 0.002 FPS: 614.2506 Mem: 303.53 Mb/s<br /><br />Radeon HD5870:<br />CLRadix Time: 0.003 FPS: 372.9952 Mem: 184.31 Mb/s<br /><br /><span style="font-weight:bold;">Single SPU:</span><br /><br />quickSort SPU Time: 0.031 FPS: 32.5298 Mem: 32.15 Mb/s<br />radixSort SPU Time: 0.004 FPS: 226.9632 Mem: 224.30 Mb/s<br /><br /><span style="font-weight:bold;">Elements 1036288:</span><br /><br /><span style="font-weight:bold;">CUDA:</span><br /><br />GeForce 9600GT:<br />CURadix Time: 0.036 FPS: 27.8808 Mem: 220.43 Mb/s<br /><br />GeForce GTX 260:<br />CURadix Time: 0.013 FPS: 74.1400 Mem: 586.17 Mb/s<br /><br />GeForce GTX 480:<br />CURadix Time: 0.006 FPS: 161.9958 Mem: 1280.78 Mb/s<br /><br /><span style="font-weight:bold;">OpenCL:</span><br /><br />GeForce 9600GT:<br />CLRadix Time: 0.034 FPS: 29.8312 Mem: 235.85 Mb/s<br /><br />GeForce GTX 260:<br />CLRadix Time: 0.013 FPS: 79.2959 Mem: 626.93 Mb/s<br /><br />GeForce GTX 480:<br />CLRadix Time: 0.007 FPS: 136.2955 Mem: 1077.59 Mb/s<br /><br />Radeon HD5870:<br />CLRadix Time: 0.020 FPS: 49.9800 Mem: 395.15 Mb/s<br /><br /><span style="font-weight:bold;">Single SPU:</span><br /><br />quickSort SPU Time: 0.695 FPS: 1.4381 Mem: 22.74 Mb/s<br />radixSort SPU Time: 0.070 FPS: 14.3275 Mem: 226.55 Mb/sfrustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com5tag:blogger.com,1999:blog-4753335805357856016.post-24305182272659402992010-09-06T18:57:00.003+07:002010-09-06T19:05:14.689+07:00BodyRopeThis is a new physics object which can be used for cheap rope simulations.<br /><br /><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/J6Mi9ADlmcc?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/J6Mi9ADlmcc?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="258"></embed></object><br /><br /><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/Yk7WKSebQ_s?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Yk7WKSebQ_s?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="258"></embed></object><br /><br /><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/WhoN2rdY7FM?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/WhoN2rdY7FM?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="258"></embed></object><br /><br /><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/e9kWFxyqY7g?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/e9kWFxyqY7g?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="258"></embed></object><br /><br /><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/hsDVKmqERl0?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/hsDVKmqERl0?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="258"></embed></object>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com0tag:blogger.com,1999:blog-4753335805357856016.post-465856178263433752010-09-03T12:26:00.002+07:002010-09-03T12:33:09.724+07:00Terrain occluderWorldOccluderTerrain is a new node which can occlude all invisible objects in very efficient way. Heightmap image is used as data source and raycasting operations are performed on CPU. Cone step mapping is used as raycasting optimization. Artistic quality of raycasted image is ugly but number of occluded triangles is very large :)<br /><br /><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/NTqauQcuinQ?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NTqauQcuinQ?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="258"></embed></object>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com0tag:blogger.com,1999:blog-4753335805357856016.post-54635568143590552542010-08-23T19:05:00.006+07:002010-08-23T19:15:09.489+07:00Terrain editorFirst version of terrian editor. There are some time lags by texture update because video is grabbed in real-time:<br /><br /><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/27Itj97kWQI?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/27Itj97kWQI?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="258"></embed></object>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com1tag:blogger.com,1999:blog-4753335805357856016.post-34278059939336913502010-06-13T00:34:00.004+07:002010-06-13T00:37:25.261+07:00Light shaftsThis is a new volume_shaft_base material on ObjectVolumeBox:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV260rXIAJP7AauDOOTXyA8q_wACexriaUywcd40kYeKw4OJsSFc4fUbbtTJmlKvZMDV00e5jYsfqU3ROj_sPIKgsS5sTiJ1nnNa8wxRW8ztFXWUdTT_OJWctZsTEOYusHKJPnIJ8xqcs/s1600/00002.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV260rXIAJP7AauDOOTXyA8q_wACexriaUywcd40kYeKw4OJsSFc4fUbbtTJmlKvZMDV00e5jYsfqU3ROj_sPIKgsS5sTiJ1nnNa8wxRW8ztFXWUdTT_OJWctZsTEOYusHKJPnIJ8xqcs/s400/00002.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5481942328452760098" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQxlE8_Zb_aFRSAT2W0Pt_FTeKVokXiFEnlcaPOnlMqX4Vc6oWRWJVWOTlyFXI2cthGJYDmyDCY5F_fy47yMY2-Z5MRKILasZs939O04VfN98q5QLFfj2kmHL7itewTV9Ho3cYKX7lp_w/s1600/00001.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQxlE8_Zb_aFRSAT2W0Pt_FTeKVokXiFEnlcaPOnlMqX4Vc6oWRWJVWOTlyFXI2cthGJYDmyDCY5F_fy47yMY2-Z5MRKILasZs939O04VfN98q5QLFfj2kmHL7itewTV9Ho3cYKX7lp_w/s400/00001.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5481942296240607202" /></a>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com1tag:blogger.com,1999:blog-4753335805357856016.post-60928438068266387642010-06-12T19:42:00.003+07:002010-06-12T19:52:26.193+07:00PlayStation3 Unigine status XEach rendered triangle of static and skinned meshes is culled by view frustum and front/back face tests on SPU. Skinning is performed entirely on SPU with both ordinary and dual quaternion skinning modes available. Vertex buffers for particles are generated on SPU with view frustum culling. Particles can be sorted by depth on SPU. Particles are simulated on SPU with awesome performance.frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com2tag:blogger.com,1999:blog-4753335805357856016.post-70405099327428253262010-06-07T21:36:00.002+07:002010-06-07T21:41:20.531+07:00PlayStation3 Unigine status IXHeap of code for view frustum and back face SPU culling, but result is wonderful.<br /><br />SPU skinning with view frustum and back face culling (30ms per frame)<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZz1WPXX3TAtL21pKSwUOJGoQdoT4Jb2O_hBgP_yj5oOZ2E6PMIYI9-5WF3_ysj_xo6e4oURS1wOwkgqrSwT1bwg_BMzjSp-QpgDrBMlZgOWkb9sHrX9xKQNZglae_B7apSTmY8ik_V84/s1600/00000.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZz1WPXX3TAtL21pKSwUOJGoQdoT4Jb2O_hBgP_yj5oOZ2E6PMIYI9-5WF3_ysj_xo6e4oURS1wOwkgqrSwT1bwg_BMzjSp-QpgDrBMlZgOWkb9sHrX9xKQNZglae_B7apSTmY8ik_V84/s400/00000.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5480040733729124178" /></a>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com0tag:blogger.com,1999:blog-4753335805357856016.post-65519836249426725762010-06-07T14:54:00.003+07:002010-06-07T15:03:17.657+07:00PlayStation3 Unigine status VIIISPU view frustum and back face culling slightly improves performance in Sanctuary and Tropics demo. Difference between forward and pre-pass lighting is removed.<br /><br />Sanctuary forward lighting:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlj4iu_mD74e2oach1NZaxC0S9yntvS-3cyxTqkCh-S1KmF0T0tkbujfyenzAFVmZnUsTB6k2aU685KNmGY62RyHck_V9NvEBrg-BmyGSpucU1mI-nBinJX4IE3RQwBwR7PidxmXhLj9g/s1600/00000.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlj4iu_mD74e2oach1NZaxC0S9yntvS-3cyxTqkCh-S1KmF0T0tkbujfyenzAFVmZnUsTB6k2aU685KNmGY62RyHck_V9NvEBrg-BmyGSpucU1mI-nBinJX4IE3RQwBwR7PidxmXhLj9g/s400/00000.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5479938910040660354" /></a><br />Sanctuary pre-pass lighting:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixbLBggfhP31-fmyUpLqfiggrI73ATqGFoHFyDeKnrDl9pT81vkxFmhnbOgN8pretmDe9VOYgjUZaqBh_ulP8BCoHdAnHIP3hQX8ltIUUWdBJRsTG-J-8DN9wUbCT7m3X5Ub8H9uFFFLM/s1600/00001.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixbLBggfhP31-fmyUpLqfiggrI73ATqGFoHFyDeKnrDl9pT81vkxFmhnbOgN8pretmDe9VOYgjUZaqBh_ulP8BCoHdAnHIP3hQX8ltIUUWdBJRsTG-J-8DN9wUbCT7m3X5Ub8H9uFFFLM/s400/00001.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5479938903968537762" /></a><br /><br />Tropics forward lighting:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhItpmxrAaE053oSjkiin9ONMio3Kx3gU3tfLnj4_3bLbeB4Su6hQrAID_XVUcT_LZZJktTqnGkhlK9Ic9IvUEb5Wq2aJtgdtdieGwOpg1XkzKrnC256fZFiRiU4VE8e5RlngU5kd351QQ/s1600/00002.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhItpmxrAaE053oSjkiin9ONMio3Kx3gU3tfLnj4_3bLbeB4Su6hQrAID_XVUcT_LZZJktTqnGkhlK9Ic9IvUEb5Wq2aJtgdtdieGwOpg1XkzKrnC256fZFiRiU4VE8e5RlngU5kd351QQ/s400/00002.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5479938902780626370" /></a><br />Tropics pre-pass lighting:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYafWjSQLdSa1ZqyZ28o27dPPkx3SE9mQF7C4Wo3OAC9C7B05zbx-uewmbQOaOYL3tPZBlhtekH6q0XwHjBxf_JdzA4qjmm5oyiiyG8-tu4rngC2wv_-MlM7az7P0-6tCKNuRF500-daA/s1600/00003.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYafWjSQLdSa1ZqyZ28o27dPPkx3SE9mQF7C4Wo3OAC9C7B05zbx-uewmbQOaOYL3tPZBlhtekH6q0XwHjBxf_JdzA4qjmm5oyiiyG8-tu4rngC2wv_-MlM7az7P0-6tCKNuRF500-daA/s400/00003.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5479938891012314018" /></a>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com0tag:blogger.com,1999:blog-4753335805357856016.post-24585851844431236402010-06-01T17:05:00.004+07:002010-06-01T17:10:59.617+07:00PlayStation3 Unigine status VIISPU skinning is ready, SPU triangle culling is coming...<br /><br />GPU skinning (75ms per frame)<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2q792M2uNiui5wAZB1KWm4jDnfyIytZWiuCkobdJ6tQsjIPFiqE39F392vKf8VAB42E5LVtXYCjiP_kh4IUbnFpBVvAjb5sVVYq9sAql4Ys5S5n80pqbNVaOgnAFbnak3iJZNBiTRBfc/s1600/00001.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2q792M2uNiui5wAZB1KWm4jDnfyIytZWiuCkobdJ6tQsjIPFiqE39F392vKf8VAB42E5LVtXYCjiP_kh4IUbnFpBVvAjb5sVVYq9sAql4Ys5S5n80pqbNVaOgnAFbnak3iJZNBiTRBfc/s400/00001.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477744432441763698" /></a><br /><br />SPU skinning (45ms per frame)<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCKAdnSv9jLRNWvBNEjdU5XYpjSFsJ02u3CnDz-f182xxje7oKd1l7iNXBq1xGQLiTiNL0O4lpuJiLeUoZ7MkW4LGhx6cJwApeJYpDvZEIrX7t4Nrr6BPDZ7VNJ7vAbxXSi1BGEmg7PRs/s1600/00004.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCKAdnSv9jLRNWvBNEjdU5XYpjSFsJ02u3CnDz-f182xxje7oKd1l7iNXBq1xGQLiTiNL0O4lpuJiLeUoZ7MkW4LGhx6cJwApeJYpDvZEIrX7t4Nrr6BPDZ7VNJ7vAbxXSi1BGEmg7PRs/s400/00004.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477744435665734242" /></a>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com0tag:blogger.com,1999:blog-4753335805357856016.post-9815812880559611982010-05-29T17:29:00.002+07:002010-05-29T17:42:31.176+07:00PlayStation3 Unigine status VIThe first successfully implemented SPU-accelerated thing in Unigine is particle systems render buffer generation. We have wide amount of different particle shapes: billboard, flat, point, length, random. This shapes are generated absolutely asynchronously on all available SPU's with optional depth sorting of particles, which doesn't affect performance a lot. The next target to be boosted is MeshSkinned.frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com0tag:blogger.com,1999:blog-4753335805357856016.post-21750484513423196872010-05-29T16:56:00.003+07:002010-05-29T17:27:20.036+07:00Unigine SPU runtimeInsomniac papers about their SPU shaders and SPU job management inspired me to implement such system in Unigine. We use raw SPU with SPU-based shader loading scheme. The total amount of code of this system, which parses ELF executable files itself and manages SPU shaders, is just only 1270 lines :) We can run 10000 SPU shaders with up to 8 parameters consuming only 6.7ms of PPU time. Another tasty feature of this system is ability to execute any function from SPU ELF file.frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com0tag:blogger.com,1999:blog-4753335805357856016.post-65793923416683927272010-05-29T16:21:00.004+07:002010-05-29T17:23:15.696+07:00SPU sortingAs you might know from the public papers, there are only 256 Kb of local memory on SPU, but DMA requests are very fast... quickSort isn't an appropriate algorithm for SPU architecture due to branching and generation of large number of spatially non-coherent memory requests. After several hours of attempts to keep SPU quickSort performance on an acceptable level and writing software implementation of memory cache for SPU, the resulting performance is slightly better than PPU version (on small arrays):<br /><br />elements: 1012 (16Kb)<br />quickSort PPU Time: 0.000 FPS: 3717.4719<br />quickSort SPU Time: 0.000 FPS: 5376.3438<br /><br />elements: 2024 (32Kb)<br />quickSort PPU Time: 0.001 FPS: 1923.0769<br />quickSort SPU Time: 0.000 FPS: 2652.5200<br /><br />elements: 4048 (64Kb)<br />quickSort PPU Time: 0.001 FPS: 819.6721<br />quickSort SPU Time: 0.001 FPS: 908.2652<br /><br />elements: 8096 (128Kb)<br />quickSort PPU Time: 0.003 FPS: 398.2477<br />quickSort SPU Time: 0.002 FPS: 407.3320<br /><br />elements: 16192 (256Kb)<br />quickSort PPU Time: 0.005 FPS: 187.7229<br />quickSort SPU Time: 0.006 FPS: 180.3752<br /><br />elements: 32384 (512Kb)<br />quickSort PPU Time: 0.012 FPS: 86.3185<br />quickSort SPU Time: 0.013 FPS: 78.7030<br /><br />elements: 64768 (1Mb)<br />quickSort PPU Time: 0.027 FPS: 37.6322<br />quickSort SPU Time: 0.029 FPS: 34.2044<br /><br />elements: 129536 (2Mb)<br />quickSort PPU Time: 0.056 FPS: 17.8352<br />quickSort SPU Time: 0.063 FPS: 15.8253<br /><br />elements: 259072 (4Mb)<br />quickSort PPU Time: 0.124 FPS: 8.0358<br />quickSort SPU Time: 0.139 FPS: 7.2073<br /><br />It was very difficult to sleep after this poor results... I was trying to implement radixSort on the second day in the morning... SPU instruction set fits such algorithms very well. Performance of radixSort on local SPU memory appeared to be very good especially with eliminated branching instructions. Moreover performance of DMA list operations on SPU (surprise!) is great and the resulted version of radixSort demonstrates awesome speedup:<br /><br />elements: 1012 (16Kb)<br />radixSort PPU Time: 0.000 FPS: 4081.6326<br />radixSort SPU Time: 0.000 FPS: 9615.3848<br /><br />elements: 2024 (32Kb)<br />radixSort PPU Time: 0.000 FPS: 2617.8010<br />radixSort SPU Time: 0.000 FPS: 4032.2581<br /><br />elements: 4048 (64Kb)<br />radixSort PPU Time: 0.001 FPS: 1333.3334<br />radixSort SPU Time: 0.000 FPS: 2237.1365<br /><br />elements: 8096 (128Kb)<br />radixSort PPU Time: 0.001 FPS: 673.4007<br />radixSort SPU Time: 0.001 FPS: 1168.2242<br /><br />elements: 16192 (256Kb)<br />radixSort PPU Time: 0.003 FPS: 288.8504<br />radixSort SPU Time: 0.002 FPS: 597.0150<br /><br />elements: 32384 (512Kb)<br />radixSort PPU Time: 0.008 FPS: 124.1311<br />radixSort SPU Time: 0.003 FPS: 298.3294<br /><br />elements: 64768 (1Mb)<br />radixSort PPU Time: 0.022 FPS: 45.3700<br />radixSort SPU Time: 0.007 FPS: 149.8352<br /><br />elements: 129536 (2Mb)<br />radixSort PPU Time: 0.049 FPS: 20.5351<br />radixSort SPU Time: 0.013 FPS: 75.0413<br /><br />elements: 259072 (4Mb)<br />radixSort PPU Time: 0.101 FPS: 9.9149<br />radixSort SPU Time: 0.027 FPS: 37.5587frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com1tag:blogger.com,1999:blog-4753335805357856016.post-13911026800736490882010-05-29T16:08:00.004+07:002010-05-29T16:35:37.345+07:00Intel SSE performance issueParticle system render buffer generation has been deeply refactored to obtain better performance. There was a strange performance issue during this process... You can see two versions of the same code bellow. There is no performance difference on AMD CPU between the first and the second rendering code fragments. But on Intel Core i5 the difference is huge. The first version generates only 10M particles per second, while the second one shows 60M particles per second!<br /><br /><table bgcolor="#000000" width="400"><tbody><tr><td><p></p><pre><span style="color:#ffffff;"><br /><span style="color:#80a0ff;">/*</span><span style="color:#80a0ff;"> render vertex format</span><br /><span style="color:#80a0ff;"> </span><span style="color:#80a0ff;">*/</span><br /><span style="color:#60ff60;"><b>struct</b></span> Vertex {<br /> <span style="color:#60ff60;"><b>union</b></span> {<br /> <span style="color:#60ff60;"><b>struct</b></span> {<br /> <span style="color:#60ff60;"><b>float</b></span> xyz[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">3</span></span>];<br /> <span style="color:#60ff60;"><b>int</b></span> parameters;<br /> };<br /> __m128 vec;<br /> };<br />};<br />Vertex *v = ...;<br /><br /><span style="color:#80a0ff;">/*</span><span style="color:#80a0ff;"> first version of rendering code</span><br /><span style="color:#80a0ff;"> </span><span style="color:#80a0ff;">*/</span><br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">0</span></span>].vec = _mm_add_ps(...);<br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">1</span></span>].vec = _mm_add_ps(...);<br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">2</span></span>].vec = _mm_add_ps(...);<br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">3</span></span>].vec = _mm_add_ps(...);<br /><br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">0</span></span>].parameters = value_0;<br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">1</span></span>].parameters = value_1;<br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">2</span></span>].parameters = value_2;<br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">3</span></span>].parameters = value_3;<br /><br /><span style="color:#80a0ff;">/*</span><span style="color:#80a0ff;"> second version of rendering code</span><br /><span style="color:#80a0ff;"> </span><span style="color:#80a0ff;">*/</span><br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">0</span></span>].vec = _mm_add_ps(...);<br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">0</span></span>].parameters = value_0;<br /><br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">1</span></span>].vec = _mm_add_ps(...);<br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">1</span></span>].parameters = value_1;<br /><br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">2</span></span>].vec = _mm_add_ps(...);<br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">2</span></span>].parameters = value_2;<br /><br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">3</span></span>].vec = _mm_add_ps(...);<br />v[<span style="background-color: rgb(13, 13, 13);"><span style="color:#ffa0a0;">3</span></span>].parameters = value_3;<br /></span></pre><p></p></td></tr></tbody></table>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com4tag:blogger.com,1999:blog-4753335805357856016.post-66670001074047271272010-05-17T13:34:00.003+07:002010-05-17T14:19:42.189+07:00PlayStation3 Unigine status VPlayStation3 render has been refactored several times:) Now we have stable and fast render pipeline without any CPU/GPU sync points. Render present time is always positive and we can hide update, physics and command buffer generation time when GPU renders previous frame. All Unigine demos work stable and without any rendering artifacts. Main bottleneck is GPU and SPU should helps a lot, especially in geometry culling :)<br /><br />Sanctuary forward lighting:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLa9aRtzpHkKRxIa11I-aMWy_-unwTXvD-UgvuT0h5QH382WtZe1G1GC0QB5h8TSPV4xOqfE-oBUgdal-gd7OGeXMU8CEVQbcs6g2Ev38Cib0s5_Q_IoK_lNCm5iT8DZBT3n5lLs195Zk/s1600/00000.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLa9aRtzpHkKRxIa11I-aMWy_-unwTXvD-UgvuT0h5QH382WtZe1G1GC0QB5h8TSPV4xOqfE-oBUgdal-gd7OGeXMU8CEVQbcs6g2Ev38Cib0s5_Q_IoK_lNCm5iT8DZBT3n5lLs195Zk/s400/00000.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5472124254685284178" /></a><br />Sanctuary pre-pass lighting:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPA6HcmRqcZul5tYIuYHb-r4ENpcZexrvZYkeRa3pOuHk3-RvSx7-6iftLpHC-5Z-Y46cGveEc0I0U80YTqNhu1UIPFteMVbNLh54C1XD475MX1nH4n2QKxVVmhNKa34q92wIu-S6661Y/s1600/00001.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPA6HcmRqcZul5tYIuYHb-r4ENpcZexrvZYkeRa3pOuHk3-RvSx7-6iftLpHC-5Z-Y46cGveEc0I0U80YTqNhu1UIPFteMVbNLh54C1XD475MX1nH4n2QKxVVmhNKa34q92wIu-S6661Y/s400/00001.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5472124246950879762" /></a><br /><br />Tropics forward lighting:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcf9fH_YtEaTH4nsH5_259Is-EzkhTz7YYe6bmcqpBFf6WCThF4-z0B-6rylNzUt1tcA8ojdNea-xpzd4NIsQosZ7Zlco338zNi4EGclnBUJVg1P_x7GedE0x57PrS7RzmMPhnrTSX6nw/s1600/00002.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcf9fH_YtEaTH4nsH5_259Is-EzkhTz7YYe6bmcqpBFf6WCThF4-z0B-6rylNzUt1tcA8ojdNea-xpzd4NIsQosZ7Zlco338zNi4EGclnBUJVg1P_x7GedE0x57PrS7RzmMPhnrTSX6nw/s400/00002.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5472124243242144402" /></a><br />Tropics pre-pass lighting:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJy4PtW2n5Cp-1HrFZj89DE7KV7ZrgPh-UrPjnc-vr_TOu0E9V10miKfUGu308S6eEQITV7g8YH5a5GrL3PHVMhtA5zFxCId2xkpOYXVGrYNXI0wjrRYjnap4ZeK5D3EfMNIE0OHgYKUY/s1600/00003.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJy4PtW2n5Cp-1HrFZj89DE7KV7ZrgPh-UrPjnc-vr_TOu0E9V10miKfUGu308S6eEQITV7g8YH5a5GrL3PHVMhtA5zFxCId2xkpOYXVGrYNXI0wjrRYjnap4ZeK5D3EfMNIE0OHgYKUY/s400/00003.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5472124236050031794" /></a><br /><br />Heaven forward lighting:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjupXtfTlgxoSJ912vlf-IuV3ZJymozABpyyBA86F219T0Jnyafj1b8LjXExYoevWj_GM2ptSA0j5muKInfrUxmzX1gyMbCGEMqRfPEJsfop4Z-hEkjDOrvfdlAFDVbB8NE2PfnyIu9Aak/s1600/00004.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjupXtfTlgxoSJ912vlf-IuV3ZJymozABpyyBA86F219T0Jnyafj1b8LjXExYoevWj_GM2ptSA0j5muKInfrUxmzX1gyMbCGEMqRfPEJsfop4Z-hEkjDOrvfdlAFDVbB8NE2PfnyIu9Aak/s400/00004.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5472134821943277746" /></a><br />Heaven pre-pass lighting:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijfj1TM62TJqTqyy9feXc7bVeuFeSTgw3IYqF8bnb5bd9WNjsdgDjyPCw8foYY1Th_Gx1TjBt7ml9Biaxn07raEYe1sGZDj6eTVFXhriv4V70rlU9AmhucwvVM-lD_RGeuyWaGxJ74YW4/s1600/00005.png"><img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijfj1TM62TJqTqyy9feXc7bVeuFeSTgw3IYqF8bnb5bd9WNjsdgDjyPCw8foYY1Th_Gx1TjBt7ml9Biaxn07raEYe1sGZDj6eTVFXhriv4V70rlU9AmhucwvVM-lD_RGeuyWaGxJ74YW4/s400/00005.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5472134813161130034" /></a>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com0tag:blogger.com,1999:blog-4753335805357856016.post-57474812853541607042010-05-12T09:21:00.002+07:002010-05-12T09:24:06.682+07:00Tomsk, May 12Late spring at Tomsk.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu91YkFcDKvgK0OtuGzV1n0Ya2oLNJ3ZxT62rLKfNKEjNt3ifdESasLG6HlgOqyUNeFX9QBmMdZ6meY51R-siBBMQsTJ8c2f0u_XqCHm32AmkCysqY6ri62BtxFY4dcSgjrl8UuCOV38c/s1600/tomsk_may_12.jpg"><img style="cursor:pointer; cursor:hand;width: 278px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu91YkFcDKvgK0OtuGzV1n0Ya2oLNJ3ZxT62rLKfNKEjNt3ifdESasLG6HlgOqyUNeFX9QBmMdZ6meY51R-siBBMQsTJ8c2f0u_XqCHm32AmkCysqY6ri62BtxFY4dcSgjrl8UuCOV38c/s400/tomsk_may_12.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5470203074190267698" /></a>frustumhttp://www.blogger.com/profile/11672693079674482929noreply@blogger.com2