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..

[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..

[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..

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..

[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..

[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..

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..

[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..

[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..

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 |