Dorian Fevrier's blog - Mot-clé - flickingJe m’appelle FEVRIER Dorian, je suis infographiste 3D passionné par mon métier, l’informatique en général, l’internet, la programmation et l’évolution de tout ce petit monde. Vous trouverez sur ce blog des tutoriaux, mes coups de cœurs, avis, etc.2024-01-02T23:48:05+01:00FEVRIER Dorianurn:md5:695d9c73474c33ce3dab043823509c4bDotclearMental ray for Maya: Decrease Final Gather flickingurn:md5:0a9ec9489fde5e36a8bae4182f717d0d2013-07-20T17:30:00+02:002013-07-27T22:50:24+02:00NarannInfographie 3D - Boulotenfinal gatherflickingmayamental ray<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_tn.png" alt="fg_diminuer_flicking_tn.png" style="float:left; margin: 0 1em 1em 0;" title="fg_diminuer_flicking_tn.png, juil. 2013" height="150" width="150" />In this ticket, I present a <del>simple way</del> hack (keep in mind we are talking about mental ray for Maya :baffed: ) to drastically decrease Final Gather flicking.</p>
<p>You will see this method is a little tricky but it simply aims to reproduce the <a href="http://www.spot3d.com/vray/help/maya/150R1/render_params_advancedimap.htm#basic" hreflang="en">Interp. samples</a> Vray's option behavior.</p> <h3>Foreword</h3>
<p>Before start, know that it's truly Vray which prompted me to put my nose in mental ray, especially Final Gather map merging. While everything is very simple in Vray, in mental ray, it's a pain (as usual :septic: ).</p>
<p>Basically you will have to inject scripts in the <em>Pre render frame MEL</em> and <em>Post render frame MEL</em> to recreate the behavior of Vray.</p>
<p>Mental ray actually provide a way to merge Final Gather maps, but Maya integration doesn't do it temporally (no Final Gather map with frame number name).</p>
<h3>The scene</h3>
<p>I took the typical kind of scene that brings Final Gather to its knees (and most GI caching methods in general):</p>
<ul>
<li>No lights (<em>Default Light</em> disabled).</li>
<li>A white corridor.</li>
<li>From the invisible-to-the-camera side: A plane with a white emissive material.</li>
<li>At the crossroads: Animated colorful spheres and cubes.</li>
<li>And from the other side, our camera.</li>
</ul>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_001.png" title="fg_diminuer_flicking_001.png"><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/.fg_diminuer_flicking_001_m.jpg" alt="fg_diminuer_flicking_001.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_001.png, juil. 2013" height="470" width="560" /></a></p>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_003.png" title="fg_diminuer_flicking_003.png"><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/.fg_diminuer_flicking_003_m.jpg" alt="fg_diminuer_flicking_003.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_003.png, juil. 2013" height="420" width="560" /></a></p>
<center>Keep in mind: This is an extreme case. :papi:</center>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_002.png" alt="fg_diminuer_flicking_002.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_002.png, juil. 2013" height="408" width="405" /></p>
<p>The Final Gather diffuse bounces number is high to increase visual artectacts. Everything is here to have something awful. :aupoil:</p>
<h3>Final Gather without interpolation</h3>
<p>There is a render of the scene with Final Gather generated for each frame, without interpolation (Mode <em>Automatic</em>):</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_anim_001.gif" alt="fg_anim_001.gif" style="display:block; margin:0 auto;" title="fg_anim_001.gif, juil. 2013" height="240" width="320" /></p>
<p>As you can see, there is a lot of flicking. :ideenoire:</p>
<p>How to solve this? <a href="http://docs.autodesk.com/MENTALRAY/2014/ENU/mental-ray-help/files/manual/fg_copy.html" hreflang="en">fg_copy</a> is your friend! :dentcasse: (Specially the <em>-f</em> flag).</p>
<p>Well, acutally, there is already a way to give Final Gather maps to Maya to make them merged before render. This way will be the foundation to our "temporal interpolation".</p>
<h3>Interpolate frames?</h3>
<p>Basically, the idea is simply to "mix" several Final Gather maps together to mitigate the effect of flicking.</p>
<p>For a frame <em>n</em>, we merge Final Gather maps <em>n</em>-2, <em>n</em>-1, <em>n</em>, <em>n</em>+1, and <em>n</em>+2 (two before, two after).</p>
<p>In practice, mental ray will merge Final Gather points with similar normal using <em>Min Radius</em> of the scene. Two Final Gather points having a similar normal (I suppose the <em>Normal Tolerance</em> of the <em>Final Gather Quality</em> section is used to control that) and where the distance doesn't execeed the <em>Min Radius</em> of the scene (if set to zero is 10% of the whole scene bouding box) have their color and position merged.</p>
<p>You can see the scene size mental ray is rendering using the log:</p>
<pre>
RC 0.2 41 MB info : scene extent: (-12.34,-0.45,-17.07) : (15.83,10.96,12.07)
</pre>
<p>This approach is far from perfect and you will see it doesn't solve all problems. The <em>ghosting</em> <a name="ghosting"></a> you can have, better than a by frame flicking though, is still unsightly, particularly on renders with few texture/color variations (diffuse surfaces). That said, this effect may go unnoticed on some sequences (especially camera movements), it really depends on what you've got.</p>
<h3>Bake Final Gather</h3>
<p>To be able to merge Final Gather maps before render (5 maps in our case) you must, as a first step, generate all of them. And this is what we will do. :enerve:</p>
<p>As we have a range of 101-110 and we will generate two frame before and two frame after, the final Final Gather maps sequence will be 99-112.</p>
<p>Personnally, I use <em>RenderLayers</em> overriding <em>Pre render frame MEL</em> and <em>Post render frame MEL</em> scripts to generate fg map names using the current frame (eg: <em>fgmap.0012.fgmap</em>) just before render start.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_004.png" alt="fg_diminuer_flicking_004.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_004.png, juil. 2013" height="200" width="374" /></p>
<p>For example, I override the <em>RenderLayer</em> that will be used to generate fg maps with this:</p>
<pre class="mel mel">python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.updateFgFiles()"</span><span style="color: #009900;">)</span>
python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.cleanFgParams()"</span><span style="color: #009900;">)</span></pre>
<p>Ok, that's not really sexy but as you know, <em>Pre render frame MEL</em> and <em>Post render frame MEL</em> only execute... MEL... So we ask MEL to execute Python! :baffed:</p>
<p>In a "readeable" mode, the two calls are followings:</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> preframe
<span style="color: #008000;">reload</span><span style="color: black;">(</span>preframe<span style="color: black;">)</span>
preframe.<span style="color: black;">updateFgFiles</span><span style="color: black;">(</span><span style="color: black;">)</span></pre>
<p>And:</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> preframe
<span style="color: #008000;">reload</span><span style="color: black;">(</span>preframe<span style="color: black;">)</span>
preframe.<span style="color: black;">cleanFgParams</span><span style="color: black;">(</span><span style="color: black;">)</span></pre>
<p>Of course, there is a little <em>preframe.py</em> in your: <em>maya\scripts</em>.</p>
<h4>The script</h4>
<p>Here is the contents of <em>preframe.py</em>, contents that I will explain, function by function.</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> maya.<span style="color: #dc143c;">cmds</span> <span style="color: #ff7700;font-weight:bold;">as</span> <span style="color: #dc143c;">cmds</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">def</span> cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>:
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[0]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[1]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[2]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[3]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">def</span> updateFgFiles<span style="color: black;">(</span><span style="color: black;">)</span>:
cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>
frame = <span style="color: #008000;">int</span><span style="color: black;">(</span><span style="color: #dc143c;">cmds</span>.<span style="color: black;">currentTime</span><span style="color: black;">(</span> query=<span style="color: #008000;">True</span> <span style="color: black;">)</span><span style="color: black;">)</span>
fgmapFile = <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame<span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># "fgmap.0012.fgmap"</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">"Set fgmap file for frame %s -> %s"</span> <span style="color: #66cc66;">%</span> <span style="color: black;">(</span>frame, fgmapFile<span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherRebuild"</span>, <span style="color: #ff4500;">1</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># Rebuild On</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, fgmapFile, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">def</span> prepareFgFiles<span style="color: black;">(</span><span style="color: black;">)</span>:
cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>
frame = <span style="color: #008000;">int</span><span style="color: black;">(</span><span style="color: #dc143c;">cmds</span>.<span style="color: black;">currentTime</span><span style="color: black;">(</span> query=<span style="color: #008000;">True</span> <span style="color: black;">)</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherRebuild"</span>, <span style="color: #ff4500;">2</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># Freeze</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame-<span style="color: #ff4500;">2</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[0]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame-<span style="color: #ff4500;">1</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[1]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame<span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[2]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame+<span style="color: #ff4500;">1</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[3]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame+<span style="color: #ff4500;">2</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span></pre>
<p>You can copy this in a file in <em>maya/scripts/preframe.py</em>.</p>
<h5>cleanFgParams()</h5>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">def</span> cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>:
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[0]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[1]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[2]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[3]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[4]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[5]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span></pre>
<p>This function clears the Final Gather <em>file</em> attributes (put an empty string). It's called just before setting the name of the Final Gather maps to save, and just after render, in <em>Post render frame</em>, to be sure to clear text fields.</p>
<h5>updateFgFiles()</h5>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">def</span> updateFgFiles<span style="color: black;">(</span><span style="color: black;">)</span>:
cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>
frame = <span style="color: #008000;">int</span><span style="color: black;">(</span><span style="color: #dc143c;">cmds</span>.<span style="color: black;">currentTime</span><span style="color: black;">(</span> query=<span style="color: #008000;">True</span> <span style="color: black;">)</span><span style="color: black;">)</span>
fgmapFile = <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame<span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># "fgmap.0012.fgmap"</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">"Set fgmap file for frame %s -> %s"</span> <span style="color: #66cc66;">%</span> <span style="color: black;">(</span>frame, fgmapFile<span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherRebuild"</span>, <span style="color: #ff4500;">1</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># Rebuild On</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, fgmapFile, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span></pre>
<p>This function is set in the <em>Pre render frame</em> attribute of the <em>RenderLayer</em> and is used to give a correct name to the Final Gather map to save. It gets the current frame and generates a fg map name with the frame number.</p>
<p>The little "hack":</p>
<pre class="python python"><span style="color: #008000;">str</span><span style="color: black;">(</span>frame<span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span></pre>
<p>Used to generate the frame number with padding. Converting it to string first then apply a <em>zero fill</em> of 4, to make "10" to "0010" for example.</p>
<h5>prepareFgFiles() <a name="prepareFgFiles"></a></h5>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">def</span> prepareFgFiles<span style="color: black;">(</span><span style="color: black;">)</span>:
cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>
frame = <span style="color: #008000;">int</span><span style="color: black;">(</span><span style="color: #dc143c;">cmds</span>.<span style="color: black;">currentTime</span><span style="color: black;">(</span> query=<span style="color: #008000;">True</span> <span style="color: black;">)</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherRebuild"</span>, <span style="color: #ff4500;">2</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># Freeze</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame-<span style="color: #ff4500;">2</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[0]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame-<span style="color: #ff4500;">1</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[1]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame<span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[2]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame+<span style="color: #ff4500;">1</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[3]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame+<span style="color: #ff4500;">2</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span></pre>
<p>And the last function, in <em>Pre render frame</em> of the <em>RenderLayer</em>, used to fill every text fields with Final Gather maps to merge during final render. This is the same method we used to generate Final Gather map name but we generate two before and two after.</p>
<p>This is where you put Final Gather mode to <em>Freeze</em> to ensure you will merge your files before using them as such.</p>
<h3>Render layers</h3>
<p>There is a little description of my <em>RenderLayers</em>. :)</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_005.png" alt="fg_diminuer_flicking_005.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_005.png, juil. 2013" height="183" width="419" /></p>
<p>Don't worry about FG_RAW, it's only used to render in <em>Automatic</em> mode.</p>
<h4>masterLayer</h4>
<p>The main <em>RenderLayer</em> is prepared in order to get <em>Secondary FinalGather Maps</em>.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_009.png" alt="fg_diminuer_flicking_009.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_009.png, juil. 2013" height="289" width="456" /></p>
<p>Note that, as all Maya's multi-attributes, if this values are empty, blocks are removed while reopening the scene. That's why I put the <em>temp</em> words in it. In any case, I remove this values just before frame render start (using the <em>cleanFgParams()</em> function). That's only to prevent Maya to remove entries (Workaround time!).</p>
<blockquote><p>Important: Each entry has a <em>temp</em> with a different number just so I can render the FG_RAW <em>RenderLayer</em> avoiding mental ray to try to merge a fg map it is actually generating.</p></blockquote>
<p>But there shouldn't ever be any Final Gather map named "temp" in your fg map folder. If there is, something has gone wrong during our process. :zinzin:</p>
<h4>FGMAPONLY</h4>
<p>This <em>RenderLayer</em> will be the first started. It's the one that will generate Final Gather maps (with two frames before and two frames after).</p>
<p><em>Pre render frame MEL</em> and <em>Post render frame MEL</em> to override (using <a href="http://download.autodesk.com/global/docs/maya2014/en_us/index.html?url=files/Vari_Work_with_attribute_overrides.htm,topicNumber=d30e650035" hreflang="en">Create Layer Override</a>) are followings:</p>
<pre class="mel mel">python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.updateFgFiles()"</span><span style="color: #009900;">)</span>
python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.cleanFgParams()"</span><span style="color: #009900;">)</span></pre>
<p>Don't forget to put this <em>RenderLayer</em> in <em>Multiframe</em> (<em>Optimize for Animation</em> in Maya). But the attribute can't be override from the <em>Render Settings</em>. :trollface:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_006.png" alt="fg_diminuer_flicking_006.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_006.png, juil. 2013" height="201" width="450" /></p>
<p>You must go through the <em>miDefaultOptions</em> node you can select typing this MEL command:</p>
<pre class="mel mel">select miDefaultOptions</pre>
<p>And looking for <em>Final Gather Mode</em> in <em>Extra Attributes</em>:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_007.png" alt="fg_diminuer_flicking_007.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_007.png, juil. 2013" height="116" width="306" /></p>
<p>Easy as 1-2-3... :mayaProf:</p>
<p>As there is no interest to keep the image rendered during this process, you can override <em>Render Mode</em> to make mental ray compute only Final Gather:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_005a.png" alt="fg_diminuer_flicking_005a.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_005a.png, juil. 2013" height="83" width="420" /></p>
<h4>RENDERONLY</h4>
<p>It's in this <em>RenderLayer</em> the "real" render will be done. The idea is to set the differents fg maps (<em>n</em>-2, <em>n</em>-1, <em>n</em>, <em>n</em>+1 et <em>n</em>+2) to make mental ray merging them in <em>Freeze</em> (no rebuild), and compute the final render.</p>
<pre class="mel mel">python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.prepareFgFiles()"</span><span style="color: #009900;">)</span>
python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.cleanFgParams()"</span><span style="color: #009900;">)</span></pre>
<p>I encourage you to read the <a href="https://www.fevrierdorian.com/blog/post/2013/07/20/Mental-ray-for-Maya-Decrease-Final-Gather-flicking#prepareFgFiles">prepareFgFiles()</a> function to fully understand what we do.</p>
<h3>Command line</h3>
<p>And it's time to start rendering! :popcorn:</p>
<p>I give you my two batch command line to help you:</p>
<pre>
"C:\Program Files\Autodesk\Maya2013\bin\render.exe" -mr:v 4 -mr:rt 4 -cam camera1 -rl FGMAPONLY -s 99 -e 126 -preFrame "python(\"import preframe\nreload(preframe)\npreframe.updateFgFiles()\")" -postFrame "python(\"import preframe\nreload(preframe)\npreframe.cleanFgParams()\")" -proj "D:\3D\VracProject" "D:\3D\VracProject\scenes\tuto_flick_mr_maponly.ma"
"C:\Program Files\Autodesk\Maya2013\bin\render.exe" -mr:v 4 -mr:rt 4 -cam camera1 -rl RENDERONLY -preFrame "python(\"import preframe\nreload(preframe)\npreframe.prepareFgFilesNoAnim()\")" -postFrame "python(\"import preframe\nreload(preframe)\npreframe.cleanFgParams()\")" -proj "D:\3D\VracProject" "D:\3D\VracProject\scenes\tuto_flick_mr_maponly.ma"
</pre>
<blockquote><p>Notice: I've personally encounter few problems with <em>Pre render frame MEL</em> and <em>Post render frame MEL</em> overrides. That's the reason why I "hard" write them in the commande line.</p></blockquote>
<h4>Generating Final Gather maps (first line)</h4>
<p>In the end of the first line execution, you should have the folder <em>renderData/mentalray/finalgMap</em> with something like:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_008.png" alt="fg_diminuer_flicking_008.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_008.png, juil. 2013" height="418" width="351" /></p>
<h4>Second line, render!</h4>
<p>Aaaaaaaand:</p>
<p>Before:
<img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_anim_001.gif" alt="fg_anim_001.gif" style="display:block; margin:0 auto;" title="fg_anim_001.gif, juil. 2013" height="240" width="320" /></p>
<p>After:
<img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_anim_002.gif" alt="fg_anim_002.gif" style="display:block; margin:0 auto;" title="fg_anim_002.gif, juil. 2013" height="240" width="320" /></p>
<center>FG Merge. Because I'm worth it. :smileFou:</center>
<p>Ok, I admit gif is not the best thing to assess the image quality but you will notice it's a lot more stable. You will notice too, on the right wall, the ghosting effect <a href="https://www.fevrierdorian.com/blog/post/2013/07/20/Mental-ray-for-Maya-Decrease-Final-Gather-flicking#ghosting">I was talking about</a>.</p>
<p>Once again, it's an extreme case:</p>
<ul>
<li>No direct lighting.</li>
<li>An emissive surface.</li>
<li>A corridor.</li>
<li>High number of bouces.</li>
<li>Low Final Gather quality parameters.</li>
</ul>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/tuto_flick_mr_maponly.7z">There is the scene</a> so you can see parameters and try all of this yourself.</p>
<p>Important: Keep an eye on you logs because (and I don't think it's "good" :pasClasse: ) <em>Freeze</em> mode is not as stupid it seems to be (<a href="http://docs.autodesk.com/MENTALRAY/2014/ENU/mental-ray-help/files/manual/options.html#finalgathering" hreflang="en">see the doc</a>). If a Final Gather map don't exists, it create it anyway. You will so have the impression, when the two batch lines will ends, that everything passed well (Final Gather maps are there and images so) but everything will flick...</p>
<p>Few informations you should keep an eye on (example for the frame 123):</p>
<pre>
RC 0.2 26 MB info : option: rebuild freeze
RC 0.2 26 MB info : option: files D:/3D/VracProject/renderData/mentalray/finalgMap/fgmap.0121.fgmap
RC 0.2 26 MB info : option: D:/3D/VracProject/renderData/mentalray/finalgMap/fgmap.0122.fgmap
RC 0.2 26 MB info : option: D:/3D/VracProject/renderData/mentalray/finalgMap/fgmap.0123.fgmap
RC 0.2 26 MB info : option: D:/3D/VracProject/renderData/mentalray/finalgMap/fgmap.0124.fgmap
RC 0.2 26 MB info : option: D:/3D/VracProject/renderData/mentalray/finalgMap/fgmap.0125.fgmap
</pre>
<pre>
RCFG 0.2 27 MB info : finalgather map is frozen, using loaded from file(s)
</pre>
<p>I encourage you, as a first step, to start these two lines separately and check everything passed well between them.</p>
<p>I insist on the fact that you will not necessary succeed the first time. There is actually a lot of things to do. So persevere and keep in mind "this is possible". :hehe:</p>
<h3>Variant</h3>
<p>As you can see, flicking of animated objects (spheres and cube) don't change too much. We can consider many variant to solve this problem.</p>
<p>The first approach is to generate two distinct Final Gather maps sequence:</p>
<ul>
<li>One only with animated objects (putting static objects in <em>primary rays</em> off) with higher Final Gather quality. Named <em>fg_anim.####.fgmap</em>.</li>
<li>The other only with static objects (putting animated objects in <em>primary rays</em> off in order to keep their diffuse bounces on the fg map). Named <em>fg_static.####.fgmap</em>.</li>
<li>And we merge everything just before render.</li>
</ul>
<p>We can also go a step up in complexity (while we're there... :pasClasse: ) and use the <a href="http://docs.autodesk.com/MENTALRAY/2014/ENU/mental-ray-help/files/manual/fg_copy.html" hreflang="en">fg_copy</a> command to merge animated object Final Gather maps with a higher radius to to get farther Final Gather points. That said, I'm not sure this approach produces better results but it has to be tested.</p>
<p>And last but not least, you can <a href="https://www.fevrierdorian.com/blog/post/2013/02/10/Combine-importons-with-Final-Gather-English-Translation">combine this with importons</a> to have better Final Gather points. :)</p>
<h3>Conclusion</h3>
<p>I was thinking it was impossible but we can actually "immitate" the <a href="http://www.spot3d.com/vray/help/maya/150R1/render_params_advancedimap.htm#basic" hreflang="en">Interp. samples</a> Vray option in mental ray. :sourit:</p>
<p>Of course, doing it this way is not necessarily easy, and it's again unfortunate having to fight to benefit a feature available using a simple slider in Vray... :redface:</p>
<p>However, I hope this post have interest you and that you've learned things. I think if you can put this kind of system in place, you solve the main concerns about Final Gather (or similar techniques) in animations.</p>
<p>Don't hesitate to feedbacks in comments if I missed some points/explaination you would like to have. :dentcasse:</p>
<p>See you guys!</p>
<p>Dorian</p>
<center>:marioCours:</center>
Mental ray for Maya: Diminuer le flicking du Final Gatherurn:md5:6e1993769c1741aa9a0e7135c7951be62013-07-20T17:11:00+02:002013-07-27T22:53:45+02:00NarannInfographie 3D - Boulotfinal gatherflickingfrmayamental ray<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_tn.png" alt="fg_diminuer_flicking_tn.png" style="float:left; margin: 0 1em 1em 0;" title="fg_diminuer_flicking_tn.png, juil. 2013" height="150" width="150" />Dans ce billet je vous propose d'utiliser <del>une méthode simple</del> un bricolage (on parle de mental ray for Maya là :baffed: ) visant à diminuer le flicking du Final Gather.</p>
<p>Vous allez voir que l'approche est un peu particulière mais elle vise tout bêtement à reproduire le comportement de l'option <a href="http://www.spot3d.com/vray/help/maya/150R1/render_params_advancedimap.htm#basic" hreflang="en">Interp. samples</a> de Vray.</p> <h3>Avant propos</h3>
<p>Avant de commencez sachez que c'est vraiment Vray qui m'a poussé à remettre mon nez dans mental ray, en particulier le merge des maps de Final Gather. Alors que tout est très simple dans Vray, dans mental ray, c'est la douleur (comme d'hab :septic: ).</p>
<p>En gros on va devoir injecter du script dans les <em>Pre render frame MEL</em> et <em>Post render frame MEL</em> pour recréer le comportement de Vray.</p>
<p>Mental ray permet déjà de "merger" des maps de Final Gather, mais l’intégration dans Maya ne permet pas de faire ça de manière temporelle simplement.</p>
<h3>La scène</h3>
<p>J'ai pris le genre typique de scène qui met à genou le Final Gather (et la plupart des méthodes de chaching de GI de manière générale):</p>
<ul>
<li>Aucune light (<em>Default Light</em> désactivées).</li>
<li>Un couloir blanc.</li>
<li>Du coté non visible de la caméra: Une plaque avec un material émissive blanc.</li>
<li>A l'intersection: Des sphère et des cubes colorés animés.</li>
<li>Et de l'autre coté, notre camera.</li>
</ul>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_001.png" title="fg_diminuer_flicking_001.png"><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/.fg_diminuer_flicking_001_m.jpg" alt="fg_diminuer_flicking_001.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_001.png, juil. 2013" height="470" width="560" /></a></p>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_003.png" title="fg_diminuer_flicking_003.png"><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/.fg_diminuer_flicking_003_m.jpg" alt="fg_diminuer_flicking_003.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_003.png, juil. 2013" height="420" width="560" /></a></p>
<center>C'est un cas extrême, ne l’oublions pas. :papi:</center>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_002.png" alt="fg_diminuer_flicking_002.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_002.png, juil. 2013" height="408" width="405" /></p>
<p>Le nombre de rebonds diffus du Final Gather est volontairement élevés pour gonfler les artefacts. Tout est présent pour avoir quelque chose de bien dégueulasse. :aupoil:</p>
<h3>Final Gather sans interpolation</h3>
<p>Voici un rendu de la scène avec un Final Gather calculé à chaque frame, sans interpolation (Mode <em>Automatic</em>):</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_anim_001.gif" alt="fg_anim_001.gif" style="display:block; margin:0 auto;" title="fg_anim_001.gif, juil. 2013" height="240" width="320" /></p>
<p>Comme vous pouvez le voir, ça flick pas mal. :ideenoire:</p>
<p>Comment résoudre ça? <a href="http://docs.autodesk.com/MENTALRAY/2014/ENU/mental-ray-help/files/manual/fg_copy.html" hreflang="en">fg_copy</a> est ton amis! :dentcasse: (Plus spécifiquement, l'option <em>-f</em>).</p>
<p>Bon, en fait il est déjà possible de donner des maps de Final Gather à Maya pour qu'il les merges avant rendu. C'est d’ailleurs cette approche qui va servir de base à notre "interpolation temporelle".</p>
<h3>Interpoler les frames?</h3>
<p>En gros, le principe consiste simplement à "mélanger" plusieurs maps de Final Gather entre elles pour atténuer l'effet de flicking.</p>
<p>Pour une frame <em>n</em>, on merge les maps de Final Gather <em>n</em>-2, <em>n</em>-1, <em>n</em>, <em>n</em>+1, et <em>n</em>+2 (deux avants, deux après).</p>
<p>Dans la pratique, mental ray va mélanger les points de Final Gather ayant des normales similaires en utilisant le <em>Min Radius</em> de la scène. Deux points de Final Gather ayant une normale similaire (Je suppose que c'est le paramètre <em>Normal Tolerance</em> de la section <em>Final Gather Quality</em> qui est utilisé) et dont la distance n’excède pas le <em>Min Radius</em> de la scène (qui, si il est à zéro, correspond à 10% du diamètre de la scène) voient leur couleur et leur position mélangées.</p>
<p>Vous pouvez voir la taille de la scène que mental ray utilise dans le log:</p>
<pre>
RC 0.2 41 MB info : scene extent: (-12.34,-0.45,-17.07) : (15.83,10.96,12.07)
</pre>
<p>Cette approche est loin d'être parfaite et vous verrez qu'elle ne résout pas tous les problèmes. En effet, l'effet de <em>ghosting</em> <a name="ghosting"></a> qu'elle génère, bien que plus acceptable qu'un flicking par frame, reste particulièrement disgracieux, en particulier sur les rendus avec peu de textures/variations de couleurs (surfaces "douces"). Cela dit, cet effet peut passer totalement inaperçu sur certaines séquences (notamment les mouvements de caméra), c'est donc au cas par cas.</p>
<h3>Baker le Final Gather</h3>
<p>Pour pouvoir merger les maps de Final Gather avant rendu (5 maps dans notre cas) il faut, dans un premier temps, toutes les générer. Et c'est ce qu'on va faire. :enerve:</p>
<p>Comme il va s'agir de deux fg maps avant et deux fg maps après, pour un frame range de 101 à 110, on a donc les maps de Final Gather de l'image 99 à l'image 112.</p>
<p>Personnellement, je procède par <em>RenderLayers</em> en overridant les scripts <em>Pre render frame MEL</em> et <em>Post render frame MEL</em> pour entrer le nom de la fg maps à la valeur de la frame courante (<em>fgmap.0012.fgmap</em> par exemple) juste avant que le rendu ne se lance.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_004.png" alt="fg_diminuer_flicking_004.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_004.png, juil. 2013" height="200" width="374" /></p>
<p>Par exemple, pour le <em>RenderLayer</em> qui va générer les fg maps, j'override avec ça:</p>
<pre class="mel mel">python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.updateFgFiles()"</span><span style="color: #009900;">)</span>
python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.cleanFgParams()"</span><span style="color: #009900;">)</span></pre>
<p>Bon, c'est pas super sexy mais comme vous le savez, les <em>Pre render frame MEL</em> et <em>Post render frame MEL</em> ne supporte que... Le MEL... On demande donc à du MEL d’exécuter du Python! :baffed:</p>
<p>En mode "lisible", les deux appels sont les suivants:</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> preframe
<span style="color: #008000;">reload</span><span style="color: black;">(</span>preframe<span style="color: black;">)</span>
preframe.<span style="color: black;">updateFgFiles</span><span style="color: black;">(</span><span style="color: black;">)</span></pre>
<p>Et:</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> preframe
<span style="color: #008000;">reload</span><span style="color: black;">(</span>preframe<span style="color: black;">)</span>
preframe.<span style="color: black;">cleanFgParams</span><span style="color: black;">(</span><span style="color: black;">)</span></pre>
<p>Et bien entendu, il y a un petit fichier <em>preframe.py</em> à placer dans votre: <em>maya\scripts</em>.</p>
<h4>Le script</h4>
<p>Voici le contenu du <em>preframe.py</em>, contenu que je vais détailler, fonction après fonction.</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> maya.<span style="color: #dc143c;">cmds</span> <span style="color: #ff7700;font-weight:bold;">as</span> <span style="color: #dc143c;">cmds</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">def</span> cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>:
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[0]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[1]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[2]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[3]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">def</span> updateFgFiles<span style="color: black;">(</span><span style="color: black;">)</span>:
cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>
frame = <span style="color: #008000;">int</span><span style="color: black;">(</span><span style="color: #dc143c;">cmds</span>.<span style="color: black;">currentTime</span><span style="color: black;">(</span> query=<span style="color: #008000;">True</span> <span style="color: black;">)</span><span style="color: black;">)</span>
fgmapFile = <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame<span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># "fgmap.0012.fgmap"</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">"Set fgmap file for frame %s -> %s"</span> <span style="color: #66cc66;">%</span> <span style="color: black;">(</span>frame, fgmapFile<span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherRebuild"</span>, <span style="color: #ff4500;">1</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># Rebuild On</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, fgmapFile, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">def</span> prepareFgFiles<span style="color: black;">(</span><span style="color: black;">)</span>:
cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>
frame = <span style="color: #008000;">int</span><span style="color: black;">(</span><span style="color: #dc143c;">cmds</span>.<span style="color: black;">currentTime</span><span style="color: black;">(</span> query=<span style="color: #008000;">True</span> <span style="color: black;">)</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherRebuild"</span>, <span style="color: #ff4500;">2</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># Freeze</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame-<span style="color: #ff4500;">2</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[0]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame-<span style="color: #ff4500;">1</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[1]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame<span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[2]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame+<span style="color: #ff4500;">1</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[3]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame+<span style="color: #ff4500;">2</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span></pre>
<p>Vous pouvez vous copier ça dans un <em>maya/scripts/preframe.py</em>.</p>
<h5>cleanFgParams()</h5>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">def</span> cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>:
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[0]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[1]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[2]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[3]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[4]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[5]"</span>, <span style="color: #483d8b;">""</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span></pre>
<p>Cette fonction vide les entrées des attributs de <em>file</em> du Final Gather (met une chaine de caractère vide). Elle est utilisée juste avant de setter les noms des maps de Final Gather à sauver, et juste après (en <em>Post render frame</em>), pour être sur de vider les champs de texte.</p>
<h5>updateFgFiles()</h5>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">def</span> updateFgFiles<span style="color: black;">(</span><span style="color: black;">)</span>:
cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>
frame = <span style="color: #008000;">int</span><span style="color: black;">(</span><span style="color: #dc143c;">cmds</span>.<span style="color: black;">currentTime</span><span style="color: black;">(</span> query=<span style="color: #008000;">True</span> <span style="color: black;">)</span><span style="color: black;">)</span>
fgmapFile = <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame<span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># "fgmap.0012.fgmap"</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">"Set fgmap file for frame %s -> %s"</span> <span style="color: #66cc66;">%</span> <span style="color: black;">(</span>frame, fgmapFile<span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherRebuild"</span>, <span style="color: #ff4500;">1</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># Rebuild On</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, fgmapFile, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span></pre>
<p>Cette fonction est utilisé en <em>Pre render frame</em> du <em>RenderLayer</em> et sert à donner un nom correct de map de Final Gather à sauver. Elle récupère le numéro de la frame courante et génère un nom de fg map à la frame.</p>
<p>Le petit "bricolage":</p>
<pre class="python python"><span style="color: #008000;">str</span><span style="color: black;">(</span>frame<span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span></pre>
<p>Sert à transformer le numéro de la frame en chaine de caractère (string) puis de lui appliquer un <em>zero fill</em> de 4, pour transformer "10" en "0010" par exemple.</p>
<h5>prepareFgFiles() <a name="prepareFgFiles"></a></h5>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">def</span> prepareFgFiles<span style="color: black;">(</span><span style="color: black;">)</span>:
cleanFgParams<span style="color: black;">(</span><span style="color: black;">)</span>
frame = <span style="color: #008000;">int</span><span style="color: black;">(</span><span style="color: #dc143c;">cmds</span>.<span style="color: black;">currentTime</span><span style="color: black;">(</span> query=<span style="color: #008000;">True</span> <span style="color: black;">)</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherRebuild"</span>, <span style="color: #ff4500;">2</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># Freeze</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherFilename"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame-<span style="color: #ff4500;">2</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[0]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame-<span style="color: #ff4500;">1</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[1]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame<span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[2]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame+<span style="color: #ff4500;">1</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">setAttr</span><span style="color: black;">(</span><span style="color: #483d8b;">"miDefaultOptions.finalGatherMergeFiles[3]"</span>, <span style="color: #483d8b;">"fgmap.%s.fgmap"</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">(</span>frame+<span style="color: #ff4500;">2</span><span style="color: black;">)</span>.<span style="color: black;">zfill</span><span style="color: black;">(</span><span style="color: #ff4500;">4</span><span style="color: black;">)</span>, <span style="color: #008000;">type</span>=<span style="color: #483d8b;">"string"</span><span style="color: black;">)</span></pre>
<p>Et dernière fonction, en <em>Pre render frame</em> du <em>RenderLayer</em>, qui sert à remplir tous les champs de maps à merger lors du rendu finale. C'est le même mécanisme de génération des numéros de frame mais on en génère deux avant et deux après.</p>
<p>A ce moment là, vous avez un Final Gather en mode <em>Freeze</em>, qui va merger vos fichiers avant de les utiliser tel quel.</p>
<h3>Les render layers</h3>
<p>Voici une petite description de mes <em>RenderLayers</em>. :)</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_005.png" alt="fg_diminuer_flicking_005.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_005.png, juil. 2013" height="183" width="419" /></p>
<p>Oubliez FG_RAW qui ne servait qu'à rendre en mode <em>Automatic</em>.</p>
<h4>masterLayer</h4>
<p>Le <em>RenderLayer</em> de base est préparé de manière à recevoir les <em>Secondary FinalGather Maps</em>.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_009.png" alt="fg_diminuer_flicking_009.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_009.png, juil. 2013" height="289" width="456" /></p>
<p>Notez que, comme tous les multiattributs de Maya, si ces valeurs sont vides, les blocs sont supprimés à l'ouverture de la scène. C'est la raison pour laquelle je met le mot <em>temp</em> dedans. Dans tous les cas, je supprime ces valeurs juste avant le rendu de la frame (via la fonction <em>cleanFgParams()</em> si vous avez suivi). C'est uniquement pour empêcher Maya de supprimer les entrées (Workaroundman! :nousfesonslemal: ).</p>
<blockquote><p>Note: Chaque entrée à un <em>temp</em> avec un numéro différent juste pour que je puisse rendre le <em>RenderLayer</em> FG_RAW sans que mental ray tente de merger une fg map qu'il est en train de générer.</p></blockquote>
<p>Mais en principe, jamais une map de Final Gather nommé "temp" ne devrait être créé durant notre process. Si c'est le cas c'est que quelque chose ne marche pas. :zinzin:</p>
<h4>FGMAPONLY</h4>
<p>Ce <em>RenderLayer</em> sera le premier lancé. C'est celui qui générera les maps de Final Gather (avec deux frames avant et deux frames après).</p>
<p>Les <em>Pre render frame MEL</em> et <em>Post render frame MEL</em> à overrider (via <a href="http://download.autodesk.com/global/docs/maya2014/en_us/index.html?url=files/Vari_Work_with_attribute_overrides.htm,topicNumber=d30e650035" hreflang="en">Create Layer Override</a>) sont les suivants:</p>
<pre class="mel mel">python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.updateFgFiles()"</span><span style="color: #009900;">)</span>
python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.cleanFgParams()"</span><span style="color: #009900;">)</span></pre>
<p>Il ne faut pas oublier de passer ce <em>RenderLayer</em> en <em>Multiframe</em> (<em>Optimize for Animation</em> dans Maya). Mais l'attribut n'est pas overrideable depuis l'interface. :trollface:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_006.png" alt="fg_diminuer_flicking_006.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_006.png, juil. 2013" height="201" width="450" /></p>
<p>Il faut passer par le node <em>miDefaultOptions</em> que vous pouvez sélectionnez en tapant la commande MEL suivante:</p>
<pre class="mel mel">select miDefaultOptions</pre>
<p>Et en allant chercher le <em>Final Gather Mode</em> dans les <em>Extra Attributes</em>:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_007.png" alt="fg_diminuer_flicking_007.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_007.png, juil. 2013" height="116" width="306" /></p>
<p>Simple comme bonjours... :mayaProf:</p>
<p>Comme l'image rendue à ce moment là ne nous sert pas, vous pouvez overrider le <em>Render Mode</em> pour ne rendre que l'étape de Final Gather:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_005a.png" alt="fg_diminuer_flicking_005a.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_005a.png, juil. 2013" height="83" width="420" /></p>
<h4>RENDERONLY</h4>
<p>C'est dans ce <em>RenderLayer</em> que sera fait le "vrai" rendu. L'idée étant de setter les différentes fg maps (<em>n</em>-2, <em>n</em>-1, <em>n</em>, <em>n</em>+1 et <em>n</em>+2) pour que mental ray les merges en <em>Freeze</em> (pas de rebuild), et nous calcule le résultat final.</p>
<pre class="mel mel">python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.prepareFgFiles()"</span><span style="color: #009900;">)</span>
python<span style="color: #009900;">(</span><span style="color: #ff0000;">"import preframe<span style="color: #000099; font-weight: bold;">\n</span>reload(preframe)<span style="color: #000099; font-weight: bold;">\n</span>preframe.cleanFgParams()"</span><span style="color: #009900;">)</span></pre>
<p>Je vous invite à relire la fonction <a href="https://www.fevrierdorian.com/blog/post/2013/07/20/Mental-ray-for-Maya-Diminuer-le-flicking-du-final-gather#prepareFgFiles">prepareFgFiles()</a> pour bien comprendre ce qu'on fait.</p>
<h3>La ligne de commande</h3>
<p>Et vient le moment de lancer le rendu! :popcorn:</p>
<p>Je vous donne les deux lignes de batch pour que vous puissiez vous en inspirer:</p>
<pre>
"C:\Program Files\Autodesk\Maya2013\bin\render.exe" -mr:v 4 -mr:rt 4 -cam camera1 -rl FGMAPONLY -s 99 -e 126 -preFrame "python(\"import preframe\nreload(preframe)\npreframe.updateFgFiles()\")" -postFrame "python(\"import preframe\nreload(preframe)\npreframe.cleanFgParams()\")" -proj "D:\3D\VracProject" "D:\3D\VracProject\scenes\tuto_flick_mr_maponly.ma"
"C:\Program Files\Autodesk\Maya2013\bin\render.exe" -mr:v 4 -mr:rt 4 -cam camera1 -rl RENDERONLY -preFrame "python(\"import preframe\nreload(preframe)\npreframe.prepareFgFilesNoAnim()\")" -postFrame "python(\"import preframe\nreload(preframe)\npreframe.cleanFgParams()\")" -proj "D:\3D\VracProject" "D:\3D\VracProject\scenes\tuto_flick_mr_maponly.ma"
</pre>
<blockquote><p>Note: J'ai personnellement rencontré quelques soucis avec les overrides des <em>Pre render frame MEL</em> et <em>Post render frame MEL</em>. C'est la raison pour laquelle je les écris "en dur" dans la ligne de commande.</p></blockquote>
<h4>La génération des maps de Final Gather (première ligne)</h4>
<p>A la fin de l’exécution de la première ligne, vous deviez avoir quelque chose dans le dossier <em>renderData/mentalray/finalgMap</em> qui ressemble à ça:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_diminuer_flicking_008.png" alt="fg_diminuer_flicking_008.png" style="display:block; margin:0 auto;" title="fg_diminuer_flicking_008.png, juil. 2013" height="418" width="351" /></p>
<h4>Seconde ligne, le rendu!</h4>
<p>Ne tergiversons pas.</p>
<p>Avant:
<img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_anim_001.gif" alt="fg_anim_001.gif" style="display:block; margin:0 auto;" title="fg_anim_001.gif, juil. 2013" height="240" width="320" /></p>
<p>Après:
<img src="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/fg_anim_002.gif" alt="fg_anim_002.gif" style="display:block; margin:0 auto;" title="fg_anim_002.gif, juil. 2013" height="240" width="320" /></p>
<center>FG Merge. Parce que je le vaux bien. :smileFou:</center>
<p>Bon, j’admets que le gif n'est pas ce qu'il y a de mieux pour juger de la qualité d'une image mais vous remarquerez que c'est beaucoup plus stable. Vous remarquerez aussi sur le mur droit, l'effet de ghosting <a href="https://www.fevrierdorian.com/blog/post/2013/07/20/Mental-ray-for-Maya-Diminuer-le-flicking-du-final-gather#ghosting">dont je parlais</a> précédemment.</p>
<p>Encore une fois, on est dans un cas extrême:</p>
<ul>
<li>Une surface émissive, aucune source de lumière direct.</li>
<li>Un couloir.</li>
<li>Des paramètres de rebonds élevés.</li>
<li>Des paramètres de qualité de Final Gather bas.</li>
</ul>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2013_07_20_Mental_ray_final_gather_diminuer_flicking/tuto_flick_mr_maponly.7z">Voici la scène</a> pour que vous puissiez voir un peu les paramètres.</p>
<p>Important: Suivez bien vos logs car (et je ne trouve pas ça super :pasClasse: ) le mode <em>Freeze</em> n'est pas aussi bête qu'il en a l'air (<a href="http://docs.autodesk.com/MENTALRAY/2014/ENU/mental-ray-help/files/manual/options.html#finalgathering" hreflang="en">voir doc</a>). Si une map de Final Gather n'existe pas pas, il la créé quand même. Vous aurez donc l'impression qu'à la fin de ces deux lignes tout c'est bien passé (les map de Final Gather sont là ainsi que les images) mais tout flickera...</p>
<p>Quelques infos à vérifier (exemple pour le calcule de la frame 123):</p>
<pre>
RC 0.2 26 MB info : option: rebuild freeze
RC 0.2 26 MB info : option: files D:/3D/VracProject/renderData/mentalray/finalgMap/fgmap.0121.fgmap
RC 0.2 26 MB info : option: D:/3D/VracProject/renderData/mentalray/finalgMap/fgmap.0122.fgmap
RC 0.2 26 MB info : option: D:/3D/VracProject/renderData/mentalray/finalgMap/fgmap.0123.fgmap
RC 0.2 26 MB info : option: D:/3D/VracProject/renderData/mentalray/finalgMap/fgmap.0124.fgmap
RC 0.2 26 MB info : option: D:/3D/VracProject/renderData/mentalray/finalgMap/fgmap.0125.fgmap
</pre>
<pre>
RCFG 0.2 27 MB info : finalgather map is frozen, using loaded from file(s)
</pre>
<p>Je vous invite donc, dans un premier temps, à lancer ces deux lignes séparéments et à vous assurer du résultat entre chacune.</p>
<p>J'insiste sur le fait que vous n'y arriverez pas forcément du premier coup. Il y a pas mal de choses à faire mine de rien. Donc persévérez et sachez que c'est possible. :hehe:</p>
<h3>Variante</h3>
<p>Comme vous pouvez le constater, le flicking des objets animés (sphères et cube) ne change pas des masses. On peut donc envisager plusieurs variantes pour résoudre le soucis.</p>
<p>La première approche consiste à générer deux séquence de fg map distinctes:</p>
<ul>
<li>L'une uniquement pour les objets animé (on passe les objets statiques en <em>primary rays</em> off) avec des paramètres de Final Gather plus élevés. Nommé <em>fg_anim.####.fgmap</em>.</li>
<li>L'autre uniquement pour les objets statiques (on passe les objets animés en <em>primary rays</em> off de manière à conserver leurs rebonds diffus sur la fg map des objets statiques). Nommé <em>fg_static.####.fgmap</em>.</li>
<li>Et on merge l'ensemble après.</li>
</ul>
<p>On peut aussi aller un cran au dessus dans la complexité (au point ou on en est :pasClasse: ) et utiliser la commande <a href="http://docs.autodesk.com/MENTALRAY/2014/ENU/mental-ray-help/files/manual/fg_copy.html" hreflang="en">fg_copy</a> pour merger les fg maps d'anim avec un radius plus élevé pour aller chercher les points de Final Gather plus loins dans l'espace. Cela dit, je ne suis pas sur que cette méthode offre de meilleurs résultats mais c'est à tester.</p>
<p>Et enfin, vous pouvez <a href="https://www.fevrierdorian.com/blog/post/2013/02/10/Combiner-les-importons-avec-le-Final-Gather">combiner ça avec les importons</a> pour avoir de meilleur points de Final Gather. :)</p>
<h3>Conclusion</h3>
<p>Je pensais que c'était impossible mais finalement, on peut bien "faker" l'option <a href="http://www.spot3d.com/vray/help/maya/150R1/render_params_advancedimap.htm#basic" hreflang="en">Interp. samples</a> de Vray dans mental ray. :sourit:</p>
<p>Bien sur, faire ça de cette manière n'est pas forcément super évident, et il est une fois de plus regrettable de devoir se battre à ce point pour profiter d'un feature accessible via un simple slider dans Vray... :redface:</p>
<p>Toutefois, j'espère que ce billet vous aura intéressé et que vous y avez appris des choses. Je pense que si on arrive à mettre ce genre de système en place, on diminue pas mal l'un des principaux soucis du Final Gather (ou techniques similaires) dans les animations.</p>
<p>N'hésitez pas à me faire des retours dans les commentaires si il manque des éléments. :dentcasse:</p>
<p>A bientôt!</p>
<p>Dorian</p>
<center>:marioCours:</center>