-
Notifications
You must be signed in to change notification settings - Fork 0
/
pbrren.py
100 lines (79 loc) · 3.56 KB
/
pbrren.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
from argparse import ArgumentParser
from os.path import abspath
from pathlib import Path
from pbrt.runner import run_imgtool, run_pbrt
from shutil import move
from terminal import get_logger, verify_path, log_output
if __name__ == "__main__":
parser = ArgumentParser(
description="Render all pbrt scenes with a single command.")
parser.add_argument('-debug', action='store_true',
help="run in debug mode")
parser.add_argument('--res-dir', type=str, required=True,
help="path to the directory containing files generated by pbrgen.py")
parser.add_argument('--pbrt-dir', type=str, required=True,
help="path to the directory contaning pbrt and imgtool executables")
parser.add_argument('-gpu', action='store_true',
help="use wavefront rendering (GPU) for pbrt")
args = parser.parse_args()
verbose = 'DEBUG' if args.debug else 'INFO'
logger = get_logger(__name__, verbose)
# All resources
res_dir = Path(abspath(args.res_dir))
irois_exr_file = res_dir/"irois.exr"
house_exr_file = res_dir/"lighthouse.exr"
albedo_file = res_dir/"albedo.png"
scene_render_file = res_dir/"scene.pbrt"
plane_render_file = res_dir/"plane.pbrt"
mall_render_file = res_dir/"mask_all.pbrt"
mobj_render_file = res_dir/"mask_obj.pbrt"
try:
verify_path(logger, res_dir)
verify_path(logger, irois_exr_file)
verify_path(logger, house_exr_file)
verify_path(logger, albedo_file)
verify_path(logger, scene_render_file)
verify_path(logger, plane_render_file)
verify_path(logger, mall_render_file)
verify_path(logger, mobj_render_file)
except FileNotFoundError:
exit(1)
# pbrt and imgtool executables
pbrt_dir = Path(abspath(args.pbrt_dir))
imgtool_file = pbrt_dir/"imgtool"
pbrt_file = pbrt_dir/"pbrt"
# Use imgtool to convert equirectangular maps to their octahedral equal
# area representations
for exr_file in [irois_exr_file, house_exr_file]:
imgtool_cmd = f"{imgtool_file} makeequiarea {exr_file} --outfile {exr_file}"
logger.info(f"[imgtool] re-encoding env map for {exr_file.name}...")
result = run_imgtool(imgtool_cmd)
if result.returncode != 0:
logger.error("error running imgtool:")
logger.error(result.stderr)
exit(1)
log_output(logger, "EXR file written to", exr_file)
# Use imgtool to convert albedo map to EXR
albedo_exr_file = res_dir/"albedo.exr"
imgtool_cmd = f"{imgtool_file} convert {albedo_file} --outfile {albedo_exr_file}"
logger.info(f"[>] converting {albedo_file.name} to EXR...")
result = run_imgtool(imgtool_cmd)
if result.returncode != 0:
logger.error("error running imgtool:")
logger.error(result.stderr)
exit(1)
log_output(logger, "EXR file written to", albedo_exr_file)
# Render the I_all scene
run_pbrt(pbrt_file, scene_render_file, args.gpu, logger)
move("scene.exr", res_dir/"scene.exr")
# Render the I_pln scene
run_pbrt(pbrt_file, plane_render_file, args.gpu, logger)
move("plane.exr", res_dir/"plane.exr")
# Render the M_all scene
run_pbrt(pbrt_file, mall_render_file, args.gpu, logger)
move("mask_all.png", res_dir/"mask_all.png")
# Render the M_obj scene
run_pbrt(pbrt_file, mobj_render_file, args.gpu, logger)
move("mask_obj.png", res_dir/"mask_obj.png")
relative_output_dir = res_dir.resolve().relative_to(Path.cwd())
logger.info(f"all rendered files have been moved to {relative_output_dir}")