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 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 lmfunctest as ft
import lmscene
import lightmetrica as lm
[2]:
%load_ext lightmetrica_jupyter
[3]:
# Initialize Lightmetrica
lm.init('user::default', {})
lm.log.init('logger::jupyter', {})
lm.parallel.init('parallel::openmp', {
    'numThreads': -1
})
lm.info()
lm.comp.loadPlugin(os.path.join(ft.env.bin_path, 'accel_nanort'))
lm.comp.loadPlugin(os.path.join(ft.env.bin_path, 'accel_embree'))
[I|0.000|114@user  ] Lightmetrica -- Version 3.0.0 (rev. fe30e7c) Linux x64
[I|0.000|179@compon] Loading plugin [name='accel_nanort']
[I|0.001|197@compon]   Successfully loaded
[I|0.001|179@compon] Loading plugin [name='accel_embree']
[I|0.002|197@compon]   Successfully loaded
[3]:
True

Difference images (pixelwised RMSE)

Correct if the difference images are blank.

[4]:
# Function to build and render the image
def build_and_render(accel):
    lm.build(accel, {})
    lm.asset('film_output', 'film::bitmap', {'w': 1920, 'h': 1080})
    lm.render('renderer::raycast', {
        'output': lm.asset('film_output')
    })
    return np.copy(lm.buffer(lm.asset('film_output')))
[5]:
# Accels and scenes
accels = ['accel::nanort', 'accel::embree', 'accel::embreeinstanced']
scenes = lmscene.scenes_small()
[6]:
# Execute rendering for each scene and accel
rmse_df = pd.DataFrame(columns=accels, index=scenes)
for scene in scenes:
    print("Rendering [scene='{}']".format(scene))

    # Load scene
    lm.reset()
    lmscene.load(ft.env.scene_path, scene)

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

    # Check consistency for other accels
    for accel in accels:
        # Render and compute a different image
        img = build_and_render(accel)
        diff = ft.rmse_pixelwised(ref, img)

        # Record rmse
        rmse = ft.rmse(ref, img)
        rmse_df[accel][scene] = rmse

        # 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('{}, accel::sahbvh vs. {}'.format(scene, accel))
        plt.show()
Rendering [scene='fireplace_room']
[I|0.039|48@assets ] Loading asset [name='camera_main']
[I|0.040|48@assets ] Loading asset [name='model_obj']
[I|0.040|29@objload]   Loading OBJ file [path='fireplace_room.obj']
[I|0.040|169@objloa]   Loading MTL file [path='fireplace_room.mtl']
[I|0.040|44@texture]   Loading texture [path='wood.ppm']
[I|0.146|44@texture]   Loading texture [path='leaf.ppm']
[I|0.150|44@texture]   Loading texture [path='picture8.ppm']
[I|0.191|44@texture]   Loading texture [path='wood5.ppm']
[I|0.631|246@scene ] Building acceleration structure [name='accel::sahbvh']
[I|0.632|131@accel_]   Flattening scene
[I|0.660|261@accel_]   Building
[I|1.420|48@assets ] Loading asset [name='film_output']
[I|1.508|151@user  ] Starting render [name='renderer::raycast']
[I|2.010|125@progre] Processing [iter=484000/2073600, progress=23.3%, ETA=1.6s]
[I|2.511|125@progre] Processing [iter=870200/2073600, progress=42.0%, ETA=1.4s]
[I|3.012|125@progre] Processing [iter=1387000/2073600, progress=66.9%, ETA=0.7s]
[I|3.513|125@progre] Processing [iter=1885600/2073600, progress=90.9%, ETA=0.2s]
[I|3.685|132@progre] Processing [completed]
[I|3.811|246@scene ] Building acceleration structure [name='accel::nanort']
[I|3.811|38@accel_n]   Flattening scene
[I|3.823|68@accel_n]   Building
[I|4.073|48@assets ] Loading asset [name='film_output']
[I|4.074|61@assets ]   Asset [name='film_output'] has been already loaded. Replacing..
[I|4.160|151@user  ] Starting render [name='renderer::raycast']
[I|4.662|125@progre] Processing [iter=342400/2073600, progress=16.5%, ETA=2.5s]
[I|5.163|125@progre] Processing [iter=615500/2073600, progress=29.7%, ETA=2.4s]
[I|5.664|125@progre] Processing [iter=889300/2073600, progress=42.9%, ETA=2.0s]
[I|6.165|125@progre] Processing [iter=1247000/2073600, progress=60.1%, ETA=1.3s]
[I|6.666|125@progre] Processing [iter=1591300/2073600, progress=76.7%, ETA=0.8s]
[I|7.167|125@progre] Processing [iter=1905800/2073600, progress=91.9%, ETA=0.3s]
[I|7.401|132@progre] Processing [completed]
../_images/executed_functest_func_accel_consistency_7_1.png
[I|7.956|246@scene ] Building acceleration structure [name='accel::embree']
[I|7.958|68@accel_e]   Flattening scene
[I|7.963|102@accel_]   Building
[I|8.018|48@assets ] Loading asset [name='film_output']
[I|8.018|61@assets ]   Asset [name='film_output'] has been already loaded. Replacing..
[I|8.106|151@user  ] Starting render [name='renderer::raycast']
[I|8.607|125@progre] Processing [iter=673600/2073600, progress=32.5%, ETA=1.0s]
[I|9.108|125@progre] Processing [iter=1440700/2073600, progress=69.5%, ETA=0.4s]
[I|9.515|132@progre] Processing [completed]
../_images/executed_functest_func_accel_consistency_7_3.png
[I|10.055|246@scene ] Building acceleration structure [name='accel::embreeinstanced']
[I|10.055|72@accel_e]   Flattening scene
[I|10.055|150@accel_]   Building
[I|10.116|48@assets ] Loading asset [name='film_output']
[I|10.116|61@assets ]   Asset [name='film_output'] has been already loaded. Replacing..
[I|10.203|151@user  ] Starting render [name='renderer::raycast']
[I|10.704|125@progre] Processing [iter=634600/2073600, progress=30.6%, ETA=1.1s]
[I|11.205|125@progre] Processing [iter=1341200/2073600, progress=64.7%, ETA=0.5s]
[I|11.702|132@progre] Processing [completed]
../_images/executed_functest_func_accel_consistency_7_5.png
Rendering [scene='cornell_box_sphere']
[I|12.322|48@assets ] Loading asset [name='camera_main']
[I|12.323|48@assets ] Loading asset [name='model_obj']
[I|12.323|29@objload]   Loading OBJ file [path='CornellBox-Sphere.obj']
[I|12.323|169@objloa]   Loading MTL file [path='CornellBox-Sphere.mtl']
[I|12.326|246@scene ] Building acceleration structure [name='accel::sahbvh']
[I|12.326|131@accel_]   Flattening scene
[I|12.326|261@accel_]   Building
[I|12.332|48@assets ] Loading asset [name='film_output']
[I|12.418|151@user  ] Starting render [name='renderer::raycast']
[I|12.920|125@progre] Processing [iter=1130000/2073600, progress=54.5%, ETA=0.4s]
[I|13.274|132@progre] Processing [completed]
[I|13.398|246@scene ] Building acceleration structure [name='accel::nanort']
[I|13.399|38@accel_n]   Flattening scene
[I|13.399|68@accel_n]   Building
[I|13.402|48@assets ] Loading asset [name='film_output']
[I|13.402|61@assets ]   Asset [name='film_output'] has been already loaded. Replacing..
[I|13.490|151@user  ] Starting render [name='renderer::raycast']
[I|13.992|125@progre] Processing [iter=956900/2073600, progress=46.1%, ETA=0.6s]
[I|14.466|132@progre] Processing [completed]
../_images/executed_functest_func_accel_consistency_7_7.png
[I|15.002|246@scene ] Building acceleration structure [name='accel::embree']
[I|15.002|68@accel_e]   Flattening scene
[I|15.003|102@accel_]   Building
[I|15.004|48@assets ] Loading asset [name='film_output']
[I|15.004|61@assets ]   Asset [name='film_output'] has been already loaded. Replacing..
[I|15.092|151@user  ] Starting render [name='renderer::raycast']
[I|15.593|125@progre] Processing [iter=1080200/2073600, progress=52.1%, ETA=0.5s]
[I|15.993|132@progre] Processing [completed]
../_images/executed_functest_func_accel_consistency_7_9.png
[I|16.532|246@scene ] Building acceleration structure [name='accel::embreeinstanced']
[I|16.533|72@accel_e]   Flattening scene
[I|16.533|150@accel_]   Building
[I|16.534|48@assets ] Loading asset [name='film_output']
[I|16.534|61@assets ]   Asset [name='film_output'] has been already loaded. Replacing..
[I|16.621|151@user  ] Starting render [name='renderer::raycast']
[I|17.123|125@progre] Processing [iter=1047000/2073600, progress=50.5%, ETA=0.5s]
[I|17.546|132@progre] Processing [completed]
../_images/executed_functest_func_accel_consistency_7_11.png
Rendering [scene='cube']
[I|18.082|48@assets ] Loading asset [name='camera_main']
[I|18.082|48@assets ] Loading asset [name='model_obj']
[I|18.082|29@objload]   Loading OBJ file [path='cube.obj']
[I|18.082|169@objloa]   Loading MTL file [path='default.mtl']
[I|18.083|44@texture]   Loading texture [path='default.png']
[I|18.096|246@scene ] Building acceleration structure [name='accel::sahbvh']
[I|18.096|131@accel_]   Flattening scene
[I|18.097|261@accel_]   Building
[I|18.097|48@assets ] Loading asset [name='film_output']
[I|18.183|151@user  ] Starting render [name='renderer::raycast']
[I|18.684|125@progre] Processing [iter=1234800/2073600, progress=59.5%, ETA=0.3s]
[I|19.014|132@progre] Processing [completed]
[I|19.142|246@scene ] Building acceleration structure [name='accel::nanort']
[I|19.142|38@accel_n]   Flattening scene
[I|19.142|68@accel_n]   Building
[I|19.142|48@assets ] Loading asset [name='film_output']
[I|19.143|61@assets ]   Asset [name='film_output'] has been already loaded. Replacing..
[I|19.231|151@user  ] Starting render [name='renderer::raycast']
[I|19.733|125@progre] Processing [iter=1225500/2073600, progress=59.1%, ETA=0.3s]
[I|20.071|132@progre] Processing [completed]
../_images/executed_functest_func_accel_consistency_7_13.png
[I|20.614|246@scene ] Building acceleration structure [name='accel::embree']
[I|20.614|68@accel_e]   Flattening scene
[I|20.614|102@accel_]   Building
[I|20.614|48@assets ] Loading asset [name='film_output']
[I|20.615|61@assets ]   Asset [name='film_output'] has been already loaded. Replacing..
[I|20.702|151@user  ] Starting render [name='renderer::raycast']
[I|21.204|125@progre] Processing [iter=1110400/2073600, progress=53.5%, ETA=0.4s]
[I|21.665|132@progre] Processing [completed]
../_images/executed_functest_func_accel_consistency_7_15.png
[I|22.315|246@scene ] Building acceleration structure [name='accel::embreeinstanced']
[I|22.315|72@accel_e]   Flattening scene
[I|22.315|150@accel_]   Building
[I|22.315|48@assets ] Loading asset [name='film_output']
[I|22.315|61@assets ]   Asset [name='film_output'] has been already loaded. Replacing..
[I|22.404|151@user  ] Starting render [name='renderer::raycast']
[I|22.905|125@progre] Processing [iter=1079000/2073600, progress=52.0%, ETA=0.5s]
[I|23.366|132@progre] Processing [completed]
../_images/executed_functest_func_accel_consistency_7_17.png

RMSE

Correct if the values are near zero.

[7]:
rmse_df
[7]:
accel::nanort accel::embree accel::embreeinstanced
fireplace_room 3.37612e-15 0.000946631 0.000946631
cornell_box_sphere 0.00108688 0.00115651 0.00115651
cube 0 0 0