Just an update on my experience (again I'm just sharing this for the benefit of others):
Switching on Indirect Diffuse (GI) Mode seems to work:
I found that switching on GI helped, it dramatically decreased the rate at which the white spots were appearing (I encountered no frames with the white spots while I turned it on, but I hadn't tested it thoroughly.) It is in Render Settings>Quality (this is for mentalray).

I really don't know what it does though yet, I just found that it seemed to work for this. The downsides are it at least doubles the rendering time, and seems to affect the lighting across the scene. It did make my lighting look softer and more tinged but since I had already rendered some other frames, I didn't want to throw those away because of the lighting inconsistency, so I didn't end up using it. But it would be totally fine if you're okay with all your frames having it switched on.
Rendering region works:
When it didn't work, I found that Rendering a Region at a time was a lot faster than re-rendering the whole image. Sometimes it would take anywhere between 1 and 10 or so tries, but it's pretty much guaranteed to work at some point. This is probably the easiest option if you have only a couple of frames that are tainted.
More observations and ideas on what causes it:
This time I noticed that the white spots appeared wherever areas of highlight on the ocean shader met the darker areas of the land, and it was in the same consistent spot for certain frames. For example, the ocean peaks were lighter in colour and whenever they met the land, the white spots were very likely to appear.
What wasn't consistent, however, was when mentalray decided to render the area correctly as expected without the white spots; it seemed pretty random when I re-rendered a region. This might suggest that the white spots appear where there is more contrast between lighter and darker areas but I couldn't be sure. I initially suspected it was some paintfx-to-polygons that were where there were white spots but it wasn't.
Batch Render workaround:
- The Batch Render workaround worked when I found I could render 3 frames in a row manually without any white spots appearing. But I had at least a hundred frames that had the white spots and I did do it for all of them manually. There's no reason why no one else can't take that path too 🙂
- It might seem a bit tedious, but it was pretty much the fastest option I had though -- it was quicker to re-render a section than wait for a batch render, then look at all those frames that were 'tainted' and then re-render those. So if you have the patience, I split John Mather's script into one that saves the current frame that has been rendered in the Render Window, and another one that renders the next frame. Even if it doesn't end up being used for fixing the white spots, it might be helpful for other things.
All of this edited from John Mather's work: https://www.creativecrash.com/users/john-mather/forums
Script for saving frame that has just been rendered in Render Window:
There are two things to set: the prefix of the name of the save file, and the frame padding. These options are the same as in the Render Settings:

The script defaults to the image format you have set in the Render Window. In the MEL script, I denoted where to set them with // >>> If anyone does happen to end up using this, I would be more than happy to help out with whatever I can but I don't want to dwell on it too much 🙂 A quick tip, to run these go to Windows>General Editors>Script Editor and paste them in the bottom window.
// Save frame currently in Render Window
// This has been edited by t_111111 http://forums.autodesk.com/t5/user/viewprofilepage/user-id/4194214
// Original from:
// Batch rendering workaround V4 - John Mather (NextDesign)
// Author page: http://www.creativecrash.com/users/john-mather
// Check for updates here: http://simplymaya.com/forum/showthread.php?p=318227
// >>> Set file name here
string $filename = "";
// >>> Set frame padding here
int $nFramePadLength = 4; // eg name.0000.ext (4 zeros)
// Save the current time unit in a variable
// string $timeFormat = `currentTime -query -time`;
float $time = (`currentTime -q`);
int $startFrame = $time;
string $directory = (`workspace -q -rd` + "images/");
// check for render panel. Found here: http://www.creativecrash.com/forums/mel/topics/error-object-not-found-renderview
string $renderPanel;
string $renderPanels[] = `getPanel -scriptType "renderWindowPanel"`;
if(size($renderPanels)) {
$renderPanel = $renderPanels[0];
} else
{
$renderPanel = `scriptedPanel -type "renderWindowPanel" -unParent renderView`;
scriptedPanel -e -label "Render View" $renderPanel;
}
// get the image format in the render globals
int $format = `getAttr "defaultRenderGlobals.imageFormat"`;
string $extension = "";
switch($format)
{
case 0: $extension = "gif"; break;
case 1: $extension = "pic"; break;
case 2: $extension = "rla"; break;
case 3: $extension = "tif"; break;
case 4: $extension = "tif"; break;
case 5: $extension = "sgi"; break;
case 6: $extension = "als"; break;
case 7: $extension = "iff"; break;
case 8: $extension = "jpg"; break;
case 9: $extension = "eps"; break;
case 10: $extension = "iff"; break;
case 11: $extension = "cin"; break;
case 12: $extension = "yuv"; break;
case 13: $extension = "sgi"; break;
case 19: $extension = "tga"; break;
case 20: $extension = "bmp"; break;
case 22: $extension = "mov"; break;
case 30: $extension = "pntg"; break;
case 31: $extension = "psd"; break;
case 32: $extension = "png"; break;
case 33: $extension = "pict"; break;
case 34: $extension = "qtif"; break;
case 35: $extension = "dds"; break;
case 36: $extension = "psd"; break;
}
currentTime $startFrame;
// pad the frame number
string $framePadded = $startFrame;
while (`size($framePadded)` < $nFramePadLength)
$framePadded = ("0" + $framePadded);
// You can also change the formatting of the file name here
string $concatFilename = $directory + $filename + "_" + $framePadded + "." + $extension;
if (`getApplicationVersionAsFloat` >= 2011)
// Thanks to nowayfra on creativecrash for his workaround
catch(eval(renderWindowSaveImageCallback ($renderPanel, $concatFilename, `getAttr defaultRenderGlobals.imageFormat`)));
else
renderWindowSaveImageCallback ($renderPanel, $concatFilename, `getAttr defaultRenderGlobals.imageFormat`);
Script for rendering next frame in timeline:
// Render next frame in timeline
// This has been edited by t_111111 http://forums.autodesk.com/t5/user/viewprofilepage/user-id/4194214
// Original from:
// Batch rendering workaround V4 - John Mather (NextDesign)
// Author page: http://www.creativecrash.com/users/john-mather
// Check for updates here: http://simplymaya.com/forum/showthread.php?p=318227
// Thanks to http://forums.cgsociety.org/archive/index.php?t-477327.html
int $startFrame = `currentTime -q`;
$startFrame = $startFrame + 1;
// check for render panel. Found here: http://www.creativecrash.com/forums/mel/topics/error-object-not-found-renderview
string $renderPanel;
string $renderPanels[] = `getPanel -scriptType "renderWindowPanel"`;
if(size($renderPanels)) {
$renderPanel = $renderPanels[0];
} else
{
$renderPanel = `scriptedPanel -type "renderWindowPanel" -unParent renderView`;
scriptedPanel -e -label "Render View" $renderPanel;
}
// start the progress bar
global string $gMainProgressBar;
progressBar -edit -beginProgress -isInterruptable true -status "Rendering..." -maxValue $startFrame $gMainProgressBar;
// check for user termination
if(`progressBar -query -isCancelled $gMainProgressBar`) {
// break;
// progressBar -edit
// -step 1 $gMainProgressBar
} else {
currentTime $startFrame;
renderWindowRender redoPreviousRender renderView;
}
progressBar -edit -endProgress $gMainProgressBar; // clear the progress bar
Before I used these, I had to choose the camera I wanted to render from and do the first render through it. How I used these scripts was I saved each to my shelf. Then I'd click the Render Next Frame script, then click the Save Current Frame script when it finished rendering and I'd re-rendered any region that had white spots. It saved me from having to navigate to the file directory each time I clicked save.
I also edited the whole batch render workaround a tiny bit so that it will render a specific list of frames too. It was helpful when the frames rendered correctly again after 1 try, but some were just stubborn and that's why I decided to do them manually.
Script for rendering a specific list of frames:
The set file name and set frame pad length are the same for the 'save frame currently in render window' script (the first one). There is an extra one to set, and that is the frame list. You can type in the numbers of the frames you want to batch render.
// Render a specific list of frames
// This has been edited by t_111111 http://forums.autodesk.com/t5/user/viewprofilepage/user-id/4194214
// Original from:
// Batch rendering workaround V4 - John Mather (NextDesign)
// Author page: http://www.creativecrash.com/users/john-mather
// Check for updates here: http://simplymaya.com/forum/showthread.php?p=318227
// Specific
// >>> Set file name here
string $filename = "";
// >>> Set frame list here
int $frameArray[] = {1,2,3,5,8}; // type in whatever numbers you want to batch render with commas in between e.g. {1,2,3,5,8} will batch render frames 1,2,3,5 and 8
// >>> Set frame padding here
int $nFramePadLength = 3; // eg name.0000.ext (4 zeros)
int $frameArraySize = size($frameArray); // <<<specific
string $directory = (`workspace -q -rd` + "images/");
// check for render panel. Found here: http://www.creativecrash.com/forums/mel/topics/error-object-not-found-renderview
string $renderPanel;
string $renderPanels[] = `getPanel -scriptType "renderWindowPanel"`;
if(size($renderPanels)) {
$renderPanel = $renderPanels[0];
} else
{
$renderPanel = `scriptedPanel -type "renderWindowPanel" -unParent renderView`;
scriptedPanel -e -label "Render View" $renderPanel;
}
// get the image format in the render globals
int $format = `getAttr "defaultRenderGlobals.imageFormat"`;
string $extension = "";
switch($format)
{
case 0: $extension = "gif"; break;
case 1: $extension = "pic"; break;
case 2: $extension = "rla"; break;
case 3: $extension = "tif"; break;
case 4: $extension = "tif"; break;
case 5: $extension = "sgi"; break;
case 6: $extension = "als"; break;
case 7: $extension = "iff"; break;
case 8: $extension = "jpg"; break;
case 9: $extension = "eps"; break;
case 10: $extension = "iff"; break;
case 11: $extension = "cin"; break;
case 12: $extension = "yuv"; break;
case 13: $extension = "sgi"; break;
case 19: $extension = "tga"; break;
case 20: $extension = "bmp"; break;
case 22: $extension = "mov"; break;
case 30: $extension = "pntg"; break;
case 31: $extension = "psd"; break;
case 32: $extension = "png"; break;
case 33: $extension = "pict"; break;
case 34: $extension = "qtif"; break;
case 35: $extension = "dds"; break;
case 36: $extension = "psd"; break;
}
// start the progress bar
global string $gMainProgressBar;
// progressBar -edit -beginProgress -isInterruptable true -status "Rendering..." -maxValue $endFrame $gMainProgressBar;
for ($indexOfFrameArray = 0; $indexOfFrameArray < $frameArraySize; $indexOfFrameArray++)
{
// check for user termination
if(`progressBar -query -isCancelled $gMainProgressBar`) {
break;
// progressBar -edit
// -step 1 $gMainProgressBar
} else {
int $i = $frameArray[ $indexOfFrameArray ]; // commented out for specific
currentTime $i;
renderWindowRender redoPreviousRender renderView;
// pad the frame number
string $framePadded = $i;
while (`size($framePadded)` < $nFramePadLength)
$framePadded = ("0" + $framePadded);
string $concatFilename = $directory + $filename + "_" + $framePadded + "." + $extension;
if (`getApplicationVersionAsFloat` >= 2011)
// Thanks to nowayfra on creativecrash for his workaround
catch(eval(renderWindowSaveImageCallback ($renderPanel, $concatFilename, `getAttr defaultRenderGlobals.imageFormat`)));
else
renderWindowSaveImageCallback ($renderPanel, $concatFilename, `getAttr defaultRenderGlobals.imageFormat`);
// progressBar -edit -step 1 -status ("// Rendering frame " + (($i - $startFrame) + 1) + " of " + (($endFrame - $startFrame) + 1)) $gMainProgressBar; // update the progress bar
print ("// Saved " + $concatFilename + "\n");
}
}
progressBar -edit -endProgress $gMainProgressBar; // clear the progress bar
// print ("// Completed rendering of " + ($frameArraySize) + " frames.\n");
I didn't rigorously test everything simply because of time, but hopefully they might give you some things to think about just like the other threads gave me some things to consider. The scripts are probably excessive but I just wanted to document them somewhere and I thought I might as well put them in the same place.
If anything, I learnt much about how lovely it is that there is so much help is out there, I learnt that programming could apply here too, and got to try out some MEL 🙂 Again feel free to ask or make suggestions at any time -- a lot of the information I got was at least a few years old and I would be happy to come back in a few years' time if it comes to that. (I'm very new to MEL but it seems awesome -- being able to automate things here is amazing.) I think my teacher said that others had come across the white spots problem too.
I'd just like to give a huge thanks to John Mather/NextDesign for being really lovely and conjuring this script up so quickly for the people that needed it at the start, it's helped me heaps too and also inspired me very much.