Checking consistency of acceleration structures

This test checks consistencies between different acceleration structures. We render the images with renderer::raycast with different accelleration structures for various scenes, and compute differences among them. If the implementations are correct, all difference images should be blank because ray-triangle intersection is a deterministic process.

[1]:
import lmenv
env = lmenv.load('.lmenv')
[2]:
import os
import imageio
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import lmscene
import lightmetrica as lm
[3]:
%load_ext lightmetrica_jupyter
[4]:
# Initialize Lightmetrica
lm.init()
lm.log.init('jupyter')
lm.progress.init('jupyter')
lm.info()
lm.comp.load_plugin(os.path.join(env.bin_path, 'accel_nanort'))
lm.comp.load_plugin(os.path.join(env.bin_path, 'accel_embree'))
[I|0.000] Lightmetrica -- Version 3.0.0 (rev. 70601db) Linux x64
[I|0.000] Loading plugin [name='accel_nanort']
[I|0.001] .. Successfully loaded [name='accel_nanort']
[I|0.001] Loading plugin [name='accel_embree']
[I|0.002] .. Successfully loaded [name='accel_embree']

Difference images (pixelwised RMSE)

Correct if the difference images are blank.

[5]:
# Function to build and render the image
def build_and_render(scene, accel_name):
    accel = lm.load_accel('accel', accel_name)
    scene.set_accel(accel.loc())
    scene.build()
    film = lm.load_film('film_output', 'bitmap', w=1920, h=1080)
    renderer = lm.load_renderer('renderer', 'raycast', scene=scene, output=film)
    renderer.render()
    return np.copy(film.buffer())
[6]:
# Accels and scenes
accel_names = ['nanort', 'embree', 'embreeinstanced']
scene_names = lmscene.scenes_small()
[7]:
def rmse(img1, img2):
    return np.sqrt(np.mean((img1 - img2) ** 2))

def rmse_pixelwised(img1, img2):
    return np.sqrt(np.sum((img1 - img2) ** 2, axis=2) / 3)
[8]:
# Execute rendering for each scene and accel
rmse_df = pd.DataFrame(columns=accel_names, index=scene_names)
for scene_name in scene_names:
    print("Rendering [scene='{}']".format(scene_name))

    # Load scene
    scene = lm.load_scene('scene', 'default')
    lmscene.load(scene, env.scene_path, scene_name)

    # Use the image for 'accel::sahbvh' as reference
    ref = build_and_render(scene, 'sahbvh')

    # Check consistency for other accels
    for accel_name in accel_names:
        # Render and compute a different image
        img = build_and_render(scene, accel_name)
        diff = rmse_pixelwised(ref, img)

        # Record rmse
        e = rmse(ref, img)
        rmse_df[accel_name][scene_name] = e

        # Visualize the difference image
        f = plt.figure(figsize=(10,10))
        ax = f.add_subplot(111)
        im = ax.imshow(diff, origin='lower')
        divider = make_axes_locatable(ax)
        cax = divider.append_axes("right", size="5%", pad=0.05)
        plt.colorbar(im, cax=cax)
        ax.set_title('{}, sahbvh vs. {}'.format(scene_name, accel_name))
        plt.show()
Rendering [scene='fireplace_room']
[I|0.037] Loading asset [name='scene']
[I|0.038] Loading asset [name='camera_main']
[I|0.038] Loading asset [name='model_obj']
[I|0.038] .. Loading OBJ file [path='fireplace_room.obj']
[I|0.038] .. Loading MTL file [path='fireplace_room.mtl']
[I|0.364] .. Loading texture [path='wood.ppm']
[I|0.454] .. Loading texture [path='leaf.ppm']
[I|0.457] .. Loading texture [path='picture8.ppm']
[I|0.489] .. Loading texture [path='wood5.ppm']
[I|0.541] Loading asset [name='accel']
[I|0.545] Building acceleration structure [name='accel']
[I|0.545] .. Flattening scene
[I|0.572] .. Building
[I|1.205] Loading asset [name='film_output']
[I|1.283] Loading asset [name='renderer']
[I|4.215] Loading asset [name='accel']
[I|4.215] .. Asset [name='accel'] has been already loaded. Replacing..
[I|4.220] Building acceleration structure [name='accel']
[I|4.220] .. Flattening scene
[I|4.230] .. Building
[I|4.432] Loading asset [name='film_output']
[I|4.432] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|4.513] Loading asset [name='renderer']
[I|4.513] .. Asset [name='renderer'] has been already loaded. Replacing..
../_images/executed_functest_func_accel_consistency_9_4.png
[I|9.012] Loading asset [name='accel']
[I|9.012] .. Asset [name='accel'] has been already loaded. Replacing..
[I|9.012] .. {"intcost":1.0,"maxBranchingFactor":2,"maxDepth":18,"maxLeafSize":32,"minLeafSize":1,"quality":1,"sahBlockSize":1,"travcost":1.0}
[I|9.012] .. {"compact":false,"dynamic":false,"filter":false,"robust":false}
[I|9.016] Building acceleration structure [name='accel']
[I|9.016] .. Flattening scene
[I|9.020] .. Building
[I|9.068] Loading asset [name='film_output']
[I|9.068] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|9.148] Loading asset [name='renderer']
[I|9.148] .. Asset [name='renderer'] has been already loaded. Replacing..
../_images/executed_functest_func_accel_consistency_9_7.png
[I|11.316] Loading asset [name='accel']
[I|11.316] .. Asset [name='accel'] has been already loaded. Replacing..
[I|11.320] Building acceleration structure [name='accel']
[I|11.320] .. Flattening scene
[I|11.320] .. Building
[I|11.369] Loading asset [name='film_output']
[I|11.369] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|11.449] Loading asset [name='renderer']
[I|11.449] .. Asset [name='renderer'] has been already loaded. Replacing..
../_images/executed_functest_func_accel_consistency_9_10.png
Rendering [scene='cornell_box_sphere']
[I|13.653] Loading asset [name='scene']
[I|13.653] .. Asset [name='scene'] has been already loaded. Replacing..
[I|13.653] Loading asset [name='camera_main']
[I|13.654] .. Asset [name='camera_main'] has been already loaded. Replacing..
[I|13.654] Loading asset [name='model_obj']
[I|13.654] .. Asset [name='model_obj'] has been already loaded. Replacing..
[I|13.654] .. Loading OBJ file [path='CornellBox-Sphere.obj']
[I|13.654] .. Loading MTL file [path='CornellBox-Sphere.mtl']
[I|13.658] Loading asset [name='accel']
[I|13.658] .. Asset [name='accel'] has been already loaded. Replacing..
[I|13.658] Building acceleration structure [name='accel']
[I|13.658] .. Flattening scene
[I|13.658] .. Building
[I|13.662] Loading asset [name='film_output']
[I|13.663] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|13.743] Loading asset [name='renderer']
[I|13.743] .. Asset [name='renderer'] has been already loaded. Replacing..
[I|14.963] Loading asset [name='accel']
[I|14.963] .. Asset [name='accel'] has been already loaded. Replacing..
[I|14.964] Building acceleration structure [name='accel']
[I|14.964] .. Flattening scene
[I|14.964] .. Building
[I|14.967] Loading asset [name='film_output']
[I|14.967] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|15.048] Loading asset [name='renderer']
[I|15.048] .. Asset [name='renderer'] has been already loaded. Replacing..
../_images/executed_functest_func_accel_consistency_9_15.png
[I|16.876] Loading asset [name='accel']
[I|16.876] .. Asset [name='accel'] has been already loaded. Replacing..
[I|16.877] .. {"intcost":1.0,"maxBranchingFactor":2,"maxDepth":18,"maxLeafSize":32,"minLeafSize":1,"quality":1,"sahBlockSize":1,"travcost":1.0}
[I|16.877] .. {"compact":false,"dynamic":false,"filter":false,"robust":false}
[I|16.877] Building acceleration structure [name='accel']
[I|16.877] .. Flattening scene
[I|16.877] .. Building
[I|16.878] Loading asset [name='film_output']
[I|16.878] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|16.959] Loading asset [name='renderer']
[I|16.959] .. Asset [name='renderer'] has been already loaded. Replacing..
../_images/executed_functest_func_accel_consistency_9_18.png
[I|18.518] Loading asset [name='accel']
[I|18.518] .. Asset [name='accel'] has been already loaded. Replacing..
[I|18.518] Building acceleration structure [name='accel']
[I|18.519] .. Flattening scene
[I|18.519] .. Building
[I|18.520] Loading asset [name='film_output']
[I|18.520] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|18.600] Loading asset [name='renderer']
[I|18.600] .. Asset [name='renderer'] has been already loaded. Replacing..
../_images/executed_functest_func_accel_consistency_9_21.png
Rendering [scene='cube']
[I|20.248] Loading asset [name='scene']
[I|20.248] .. Asset [name='scene'] has been already loaded. Replacing..
[I|20.248] Loading asset [name='camera_main']
[I|20.249] .. Asset [name='camera_main'] has been already loaded. Replacing..
[I|20.249] Loading asset [name='model_obj']
[I|20.249] .. Asset [name='model_obj'] has been already loaded. Replacing..
[I|20.249] .. Loading OBJ file [path='cube.obj']
[I|20.249] .. Loading MTL file [path='default.mtl']
[I|20.249] .. Loading texture [path='default.png']
[I|20.260] Loading asset [name='accel']
[I|20.260] .. Asset [name='accel'] has been already loaded. Replacing..
[I|20.260] Building acceleration structure [name='accel']
[I|20.260] .. Flattening scene
[I|20.260] .. Building
[I|20.260] Loading asset [name='film_output']
[I|20.261] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|20.326] Loading asset [name='renderer']
[I|20.326] .. Asset [name='renderer'] has been already loaded. Replacing..
[I|21.468] Loading asset [name='accel']
[I|21.468] .. Asset [name='accel'] has been already loaded. Replacing..
[I|21.468] Building acceleration structure [name='accel']
[I|21.468] .. Flattening scene
[I|21.469] .. Building
[I|21.469] Loading asset [name='film_output']
[I|21.469] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|21.548] Loading asset [name='renderer']
[I|21.548] .. Asset [name='renderer'] has been already loaded. Replacing..
../_images/executed_functest_func_accel_consistency_9_26.png
[I|23.150] Loading asset [name='accel']
[I|23.150] .. Asset [name='accel'] has been already loaded. Replacing..
[I|23.151] .. {"intcost":1.0,"maxBranchingFactor":2,"maxDepth":18,"maxLeafSize":32,"minLeafSize":1,"quality":1,"sahBlockSize":1,"travcost":1.0}
[I|23.151] .. {"compact":false,"dynamic":false,"filter":false,"robust":false}
[I|23.151] Building acceleration structure [name='accel']
[I|23.151] .. Flattening scene
[I|23.151] .. Building
[I|23.151] Loading asset [name='film_output']
[I|23.151] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|23.231] Loading asset [name='renderer']
[I|23.231] .. Asset [name='renderer'] has been already loaded. Replacing..
../_images/executed_functest_func_accel_consistency_9_29.png
[I|24.814] Loading asset [name='accel']
[I|24.814] .. Asset [name='accel'] has been already loaded. Replacing..
[I|24.814] Building acceleration structure [name='accel']
[I|24.814] .. Flattening scene
[I|24.814] .. Building
[I|24.814] Loading asset [name='film_output']
[I|24.815] .. Asset [name='film_output'] has been already loaded. Replacing..
[I|24.896] Loading asset [name='renderer']
[I|24.896] .. Asset [name='renderer'] has been already loaded. Replacing..
../_images/executed_functest_func_accel_consistency_9_32.png

RMSE

Correct if the values are near zero.

[9]:
rmse_df
[9]:
nanort embree embreeinstanced
fireplace_room 0.0 0.000947 0.000947
cornell_box_sphere 0.001087 0.001323 0.001323
cube 0.0 0.0 0.0