Hi, there. I’m writing a function for texture rendering that needs to update the rendered image in a loop. I have to deal with the z-buffer in a loop because it stores depth information that decides whether a pixel occurs front or back. Here is the code (in Numpy):
def render_texture(vertices, colors, triangles, h, w, c=3):
"""render mesh by z buffer
Args:
vertices: 3 x nver
colors: 3 x nver
triangles: 3 x ntri
h: height
w: width
"""
# initial
# print(vertices.shape, colors.shape, triangles.shape)
# exit(0)
image = np.zeros((h, w, c))
depth_buffer = np.zeros([h, w]) - 999999.0
# triangle depth: approximate the depth to the average value of z in each vertex(v0, v1, v2), since the vertices are closed to each other
tri_depth = (
vertices[2, triangles[0, :]]
+ vertices[2, triangles[1, :]]
+ vertices[2, triangles[2, :]]
) / 3.0
tri_tex = (
colors[:, triangles[0, :]]
+ colors[:, triangles[1, :]]
+ colors[:, triangles[2, :]]
) / 3.0
for i in range(triangles.shape[1]):
tri = triangles[:, i] # 3 vertex indices
# the inner bounding box
umin = max(int(np.ceil(np.min(vertices[0, tri]))), 0)
umax = min(int(np.floor(np.max(vertices[0, tri]))), w - 1)
vmin = max(int(np.ceil(np.min(vertices[1, tri]))), 0)
vmax = min(int(np.floor(np.max(vertices[1, tri]))), h - 1)
if umax < umin or vmax < vmin:
continue
for u in range(umin, umax + 1):
for v in range(vmin, vmax + 1):
if tri_depth[i] > depth_buffer[v, u] and isPointInTri(
[u, v], vertices[:2, tri]
):
depth_buffer[v, u] = tri_depth[i]
image[v, u, :] = tri_tex[:, i]
return image
I want to rewrite the code with PyTorch tensor to optimize the input through backpropagation. I know that we can’t do an in-place update for a tensor that requires grad. How should I deal with the tensor update in the for loop?