Converting PBR Metallic Data to the Realistic Material

HOOPS Luminate provides a helper function to convert data from a PBR metallic workflow into its realistic material.

Here is how to use it:

// Create the images.
RED::Object *diffuse, *reflection, *anisotropy, *ior;
RC_TEST( iresmgr->CreateImage2D( diffuse, iresmgr->GetState() ) );
RC_TEST( iresmgr->CreateImage2D( reflection, iresmgr->GetState() ) );
RC_TEST( iresmgr->CreateImage2D( anisotropy, iresmgr->GetState() ) );
RC_TEST( iresmgr->CreateImage2D( ior, iresmgr->GetState() ) );

RED::Object *albedo, *roughness, *metalness, *normal;
RC_TEST( iresmgr->CreateImage2D( albedo, iresmgr->GetState() ) );
RC_TEST( iresmgr->CreateImage2D( roughness, iresmgr->GetState() ) );
RC_TEST( iresmgr->CreateImage2D( metalness, iresmgr->GetState() ) );
RC_TEST( iresmgr->CreateImage2D( normal, iresmgr->GetState() ) );

// Load the images. Use the local storage.
RC_TEST( RED::ImageTools::Load( albedo, "albedo.png", RED::FMT_RGB, true, true, RED::TGT_TEX_2D, iresmgr->GetState() ) );
RC_TEST( RED::ImageTools::Load( roughness, "roughness.png", RED::FMT_FLOAT, true, true, RED::TGT_TEX_2D, iresmgr->GetState() ) );
RC_TEST( RED::ImageTools::Load( metalness, "metalness.png", RED::FMT_FLOAT, true, true, RED::TGT_TEX_2D, iresmgr->GetState() ) );
RC_TEST( RED::ImageTools::Load( normal, "normal.png", RED::FMT_RGB, true, true, RED::TGT_TEX_2D, iresmgr->GetState() ) );

// Convert metallic workflow images into realistic material data.
RC_TEST( RED::ImageTools::ConvertMetallicToRealisticMaterial( diffuse, 2048, 2048,        // Returned diffuse
                                                            reflection, 2048, 2048,     // Returned reflection
                                                            anisotropy, 2048, 2048,     // Returned anisotropy
                                                            ior, 2048, 2048,            // Returned IOR
                                                            NULL, 0,                    // No environment map.
                                                            albedo, RED::Color::WHITE,  // PBR Albedo
                                                            roughness, 1.f,             // PBR roughness
                                                            metalness, 1.f,             // PBR metallic
                                                            NULL, 1.f,                  // No PBR ambient occlusion
                                                            NULL, 0.5f, false,          // No alpha mask
                                                            NULL,                       // No environment texture
                                                            resmgr, iresmgr->GetState() ) );

// The convert function works in local storage, don't forget RED::IImage2D::SetPixels.
RC_TEST( diffuse->As< RED::IImage2D >()->SetPixels( RED::TGT_TEX_2D, iresmgr->GetState() ) );
RC_TEST( reflection->As< RED::IImage2D >()->SetPixels( RED::TGT_TEX_2D, iresmgr->GetState() ) );
RC_TEST( anisotropy->As< RED::IImage2D >()->SetPixels( RED::TGT_TEX_2D, iresmgr->GetState() ) );
RC_TEST( ior->As< RED::IImage2D >()->SetPixels( RED::TGT_TEX_2D, iresmgr->GetState() ) );
RC_TEST( normal->As< RED::IImage2D >()->SetPixels( RED::TGT_TEX_2D, iresmgr->GetState() ) );

// Use the textures in the realistic material: diffuse, reflection, anisotropy and normal.
// Use the returned IOR and set Fresnel on.
RC_TEST( imaterial->SetupRealisticMaterial(
false,                                                                // Double sided
true,                                                                 // Fresnel
RED::Color::RED, diffuse, RED::Matrix::IDENTITY, RED::MCL_TEX0,       // Diffusion
RED::Color::WHITE, reflection, RED::Matrix::IDENTITY, RED::MCL_TEX0,  // Reflection
RED::Color::WHITE, FLT_MAX,                                           // Reflection fog
false, false, NULL, RED::Matrix::IDENTITY,                            // Environment
RED::Color::BLACK, NULL, RED::Matrix::IDENTITY, RED::MCL_TEX0,        // Transmission
0.0f, NULL, RED::Matrix::IDENTITY, RED::MCL_TEX0,                     // Transmission glossiness
1.0f, ior, RED::Matrix::IDENTITY, RED::MCL_TEX0,                      // IOR
RED::Color::WHITE, 1.0f,                                              // Transmission scattering
false, false,                                                         // Caustics
RED::Color::BLACK, anisotropy, RED::Matrix::IDENTITY, RED::MCL_TEX0,  // Reflection anisotropy
0.0f, NULL, RED::Matrix::IDENTITY, RED::MCL_TEX0,                     // Reflection anisotropy orientation
normal, RED::Matrix::IDENTITY, RED::MCL_TEX0, RED::MCL_USER0,         // Bump
0.0f, 0.0f, NULL, RED::Matrix::IDENTITY, RED::MCL_TEX0,               // Displacement
NULL, &RED::LayerSet::ALL_LAYERS,                                     // Layersets
resmgr, iresmgr->GetState() ) );                                      // Engine stuff

In this sample, neither AO texture nor environment texture are used. They can be set to NULL.