GarmentCode / NvidiaWarp-GarmentCode /examples /example_render_opengl.py
qbhf2's picture
added NvidiaWarp and GarmentCode repos
66c9c8a
raw
history blame
5.09 kB
# Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
# NVIDIA CORPORATION and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto. Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA CORPORATION is strictly prohibited.
###########################################################################
# OpenGL renderer example
#
# Demonstrates how to set up tiled rendering and retrieves the pixels from
# OpenGLRenderer as a Warp array while keeping all memory on the GPU.
#
###########################################################################
import warp as wp
import warp.render
import numpy as np
wp.init()
# number of viewports to render in a single frame
num_tiles = 4
# whether to split tiles into subplots
split_up_tiles = True
# whether to apply custom tile arrangement
custom_tile_arrangement = False
# whether to display the pixels in a matplotlib figure
show_plot = True
# whether to render depth image to a Warp array
render_mode = "depth"
renderer = wp.render.OpenGLRenderer(vsync=False)
instance_ids = []
if custom_tile_arrangement:
positions = []
sizes = []
else:
positions = None
sizes = None
if num_tiles > 1:
# set up instances to hide one of the capsules in each tile
for i in range(num_tiles):
instances = [j for j in np.arange(13) if j != i + 2]
instance_ids.append(instances)
if custom_tile_arrangement:
angle = np.pi * 2.0 / num_tiles * i
positions.append((int(np.cos(angle) * 150 + 250), int(np.sin(angle) * 150 + 250)))
sizes.append((150, 150))
renderer.setup_tiled_rendering(instance_ids, tile_positions=positions, tile_sizes=sizes)
renderer.render_ground()
channels = 1 if render_mode == "depth" else 3
if show_plot:
import matplotlib.pyplot as plt
if split_up_tiles:
pixels = wp.zeros((num_tiles, renderer.tile_height, renderer.tile_width, channels), dtype=wp.float32)
ncols = int(np.ceil(np.sqrt(num_tiles)))
nrows = int(np.ceil(num_tiles / float(ncols)))
img_plots = []
aspect_ratio = renderer.tile_height / renderer.tile_width
fig, axes = plt.subplots(
ncols=ncols,
nrows=nrows,
constrained_layout=True,
figsize=(ncols * 3.5, nrows * 3.5 * aspect_ratio),
squeeze=False,
sharex=True,
sharey=True,
num=1,
)
tile_temp = np.zeros((renderer.tile_height, renderer.tile_width, channels), dtype=np.float32)
for dim in range(ncols * nrows):
ax = axes[dim // ncols, dim % ncols]
if dim >= num_tiles:
ax.axis("off")
continue
if render_mode == "depth":
img_plots.append(ax.imshow(tile_temp, vmin=renderer.camera_near_plane, vmax=renderer.camera_far_plane))
else:
img_plots.append(ax.imshow(tile_temp))
else:
fig = plt.figure(1)
pixels = wp.zeros((renderer.screen_height, renderer.screen_width, channels), dtype=wp.float32)
if render_mode == "depth":
img_plot = plt.imshow(pixels.numpy(), vmin=renderer.camera_near_plane, vmax=renderer.camera_far_plane)
else:
img_plot = plt.imshow(pixels.numpy())
plt.ion()
plt.show()
while renderer.is_running():
time = renderer.clock_time
renderer.begin_frame(time)
for i in range(10):
renderer.render_capsule(
f"capsule_{i}", [i - 5.0, np.sin(time + i * 0.2), -3.0], [0.0, 0.0, 0.0, 1.0], radius=0.5, half_height=0.8
)
renderer.render_cylinder(
"cylinder",
[3.2, 1.0, np.sin(time + 0.5)],
np.array(wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), wp.sin(time + 0.5))),
radius=0.5,
half_height=0.8,
)
renderer.render_cone(
"cone",
[-1.2, 1.0, 0.0],
np.array(wp.quat_from_axis_angle(wp.vec3(0.707, 0.707, 0.0), time)),
radius=0.5,
half_height=0.8,
)
renderer.end_frame()
if show_plot and plt.fignum_exists(1):
if split_up_tiles:
pixel_shape = (num_tiles, renderer.tile_height, renderer.tile_width, channels)
else:
pixel_shape = (renderer.screen_height, renderer.screen_width, channels)
if pixel_shape != pixels.shape:
# make sure we resize the pixels array to the right dimensions if the user resizes the window
pixels = wp.zeros(pixel_shape, dtype=wp.float32)
renderer.get_pixels(pixels, split_up_tiles=split_up_tiles, mode=render_mode)
if split_up_tiles:
pixels_np = pixels.numpy()
for i, img_plot in enumerate(img_plots):
img_plot.set_data(pixels_np[i])
else:
img_plot.set_data(pixels.numpy())
fig.canvas.draw()
fig.canvas.flush_events()
renderer.clear()