Share

Raw Driver - Arnold Developer Guide

In contrast to a regular output driver, which processes already filtered pixels, a "raw" driver gives you access to all the individual, unfiltered shading points along a ray, after a bucket has been completely rendered.

You can specify a raw driver in an .ass file like this:

  outputs 2 1 STRING                          # this example has two drivers:
  "RGBA RGBA my_main_filter my_main_driver"   #   1) regular driver for main RGBA output and its filter
  "raw_driver_name"                           #   2) a raw driver 

Note that you use a raw driver just by specifying its name; there is no filtering.

The implementation of a sample raw driver would look like this:

#include <ai.h>

AI_DRIVER_NODE_EXPORT_METHODS(DriverRAWMtd);

typedef struct {

} DriverRAWStruct;


node_parameters
{
   AiParameterStr( "filename", "deep.raw");
}

node_initialize
{
   DriverRAWStruct *raw = new DriverRAWStruct();

   static const char *required_aovs[] = { "FLOAT Z", "FLOAT A", NULL };

   // Initialize the driver (set the required AOVs and indicate that
   // we want values at all the depths)
   AiRawDriverInitialize(node, required_aovs, true /* deep driver */);
   AiNodeSetLocalData(node, raw);
}

node_update
{   
}

driver_supports_pixel_type
{
   // This function is not needed for raw drivers
   return true;
}

driver_open
{   
}

driver_extension
{
   static const char *extensions[] = { "raw", NULL };
   return extensions;
}

driver_needs_bucket
{
   return true;
}

driver_prepare_bucket
{   
}

driver_process_bucket
{   
}

driver_write_bucket
{
   DriverRAWStruct *raw = (DriverRAWStruct *)AiNodeGetLocalData(node);

   for (int y = bucket_yo; y < bucket_yo + bucket_size_y; y++)
   {
      for (int x = bucket_xo; x < bucket_xo + bucket_size_x; x++)
      {
         // Iterator for samples in this pixel
         AiAOVSampleIteratorInitPixel(sample_iterator, x, y);
         while (AiAOVSampleIteratorGetNext(sample_iterator))
         {
            AtVector2 position = AiAOVSampleIteratorGetOffset(sample_iterator);
            while (AiAOVSampleIteratorGetNextDepth(sample_iterator))
            {
               float a = AiAOVSampleIteratorGetAOVFlt(sample_iterator,AtString("A"));
               float z = AiAOVSampleIteratorGetAOVFlt(sample_iterator,AtString("Z"));  
            }
         }
      }
   }

}

driver_close
{   
}

node_finish
{   
} 

node_loader
{
   if (i>0)
      return false;
   node->methods = (AtNodeMethods*) DriverRAWMtd;
   node->output_type = AI_TYPE_NONE;
   node->name = "driver_raw";
   node->node_type = AI_NODE_DRIVER;
   strcpy(node->version, AI_VERSION);
   return true;
}

Was this information helpful?