diff --git a/offline_ray_tracer/include/settings.hpp b/offline_ray_tracer/include/settings.hpp
index 90655bdb69595d4bf84b7cd7fa0102050a786fe7..41d7a5f51851a5bc4294958fe23bbfc1bea1beca 100644
--- a/offline_ray_tracer/include/settings.hpp
+++ b/offline_ray_tracer/include/settings.hpp
@@ -40,13 +40,15 @@ struct settings
       if (iteratee.isMember("volume"  )) entry.volume   = iteratee["volume"  ].asString();
     }
 
-    transfer_function =  root["transfer_function"]   .asString();
-    time_scale        =  root["time_scale"       ]   .asFloat ();
-    loop              =  root["loop"             ]   .asBool  ();
-    image_size        = {root["image_size"       ][0].asUInt  (),
-                         root["image_size"       ][1].asUInt  ()};
-    samples           =  root["samples"          ]   .asUInt  ();
-    update_rate       =  root["update_rate"      ]   .asFloat ();
+    if (root.isMember("transfer_function"))
+      transfer_function =  root["transfer_function"]   .asString();
+
+    time_scale          =  root["time_scale"       ]   .asFloat ();
+    loop                =  root["loop"             ]   .asBool  ();
+    image_size          = {root["image_size"       ][0].asUInt  (),
+                           root["image_size"       ][1].asUInt  ()};
+    samples             =  root["samples"          ]   .asUInt  ();
+    update_rate         =  root["update_rate"      ]   .asFloat ();
 
     for (auto& iteratee : root["key_frames"])
     {
@@ -74,7 +76,7 @@ struct settings
 
   // Input settings.
   std::vector<data_filepath> data_filepaths    = {};
-  std::string                transfer_function = "";
+  std::string                transfer_function = std::string();
   float                      time_scale        = 1000.0f;
   bool                       loop              = true;
 
diff --git a/offline_ray_tracer/source/main.cpp b/offline_ray_tracer/source/main.cpp
index 432b1d53f01d70eabdc5c9f1561e3bbc10b42fdc..3724831d3063c7922af172dc9842004ed07193b3 100644
--- a/offline_ray_tracer/source/main.cpp
+++ b/offline_ray_tracer/source/main.cpp
@@ -25,8 +25,7 @@
 std::int32_t main(std::int32_t argc, char** argv)
 {
   std::cout << "Parsing settings.\n";
-  auto settings          = rt::settings(argv[1]);
-  auto transfer_function = rt::transfer_function(settings.transfer_function);
+  auto settings = rt::settings(argv[1]);
 
   std::cout << "Setting up renderer.\n";
   auto renderer    = vtkSmartPointer<vtkRenderer>    ::New();
@@ -52,17 +51,26 @@ std::int32_t main(std::int32_t argc, char** argv)
     interpolator->AddCamera    (key_frame.time, camera);
   }
 
-  std::cout << "Setting up actors and volumes.\n";
-  auto pd_mapper  = vtkSmartPointer<vtkPolyDataMapper>                     ::New();
-  auto ug_mapper  = vtkSmartPointer<vtkUnstructuredGridVolumeRayCastMapper>::New();
-  auto pd_actor   = vtkSmartPointer<vtkActor>                              ::New();
-  auto ug_volume  = vtkSmartPointer<vtkVolume>                             ::New();
-  pd_actor ->SetMapper                      (pd_mapper);
-  ug_volume->SetMapper                      (ug_mapper);
-  renderer ->AddActor                       (pd_actor );
-  renderer ->AddVolume                      (ug_volume);
-  ug_volume->GetProperty()->SetScalarOpacity(transfer_function.opacity_function);
-  ug_volume->GetProperty()->SetColor        (transfer_function.color_function  );
+  std::cout << "Setting up geometry.\n";
+  auto pd_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
+  auto pd_actor  = vtkSmartPointer<vtkActor>         ::New();
+  if (!settings.data_filepaths[0].geometry.empty())
+  {
+    pd_actor->SetMapper(pd_mapper);
+    renderer->AddActor (pd_actor );
+  }
+
+  std::cout << "Setting up volume.\n";
+  auto ug_mapper = vtkSmartPointer<vtkUnstructuredGridVolumeRayCastMapper>::New();
+  auto ug_volume = vtkSmartPointer<vtkVolume>                             ::New();
+  if (!settings.data_filepaths[0].volume.empty())
+  {
+    auto tf = rt::transfer_function(settings.transfer_function);
+    ug_volume->GetProperty()->SetScalarOpacity(tf.opacity_function);
+    ug_volume->GetProperty()->SetColor        (tf.color_function  );
+    ug_volume->SetMapper  (ug_mapper);
+    renderer ->AddVolume  (ug_volume);
+  }
 
   std::cout << "Setting up video writer.\n";
   auto window_to_image = vtkSmartPointer<vtkWindowToImageFilter>::New();