| | from matplotlib import image |
| | import nvdiffrast.torch as dr |
| | import torch |
| |
|
| | def _warmup(glctx, device): |
| | |
| | |
| | pos = torch.tensor([[[-0.8, -0.8, 0, 1], [0.8, -0.8, 0, 1], [-0.8, 0.8, 0, 1]]], dtype=torch.float32, device=device) |
| | tri = torch.tensor([[0, 1, 2]], dtype=torch.int32, device=device) |
| | dr.rasterize(glctx, pos, tri, resolution=[256, 256]) |
| |
|
| | class NormalsRenderer: |
| | |
| | _glctx:dr.RasterizeGLContext = None |
| | |
| | def __init__( |
| | self, |
| | mv: torch.Tensor, |
| | proj: torch.Tensor, |
| | image_size: tuple[int,int], |
| | device: str |
| | ): |
| | self._mvp = proj @ mv |
| | self._image_size = image_size |
| | |
| | self._glctx = dr.RasterizeCudaContext(device=device) |
| | _warmup(self._glctx, device) |
| |
|
| | def render(self, |
| | vertices: torch.Tensor, |
| | faces: torch.Tensor, |
| | colors: torch.Tensor = None, |
| | normals: torch.Tensor = None, |
| | return_triangles: bool = False |
| | ) -> torch.Tensor: |
| |
|
| | V = vertices.shape[0] |
| | faces = faces.type(torch.int32) |
| | vert_hom = torch.cat((vertices, torch.ones(V,1,device=vertices.device)),axis=-1) |
| | vertices_clip = vert_hom @ self._mvp.transpose(-2,-1) |
| | rast_out,_ = dr.rasterize(self._glctx, vertices_clip, faces, resolution=self._image_size, grad_db=False) |
| | vert_nrm = (normals+1)/2 if normals is not None else colors |
| | nrm, _ = dr.interpolate(vert_nrm, rast_out, faces) |
| | alpha = torch.clamp(rast_out[..., -1:], max=1) |
| | nrm = torch.concat((nrm,alpha),dim=-1) |
| | nrm = dr.antialias(nrm, rast_out, vertices_clip, faces) |
| | if return_triangles: |
| | return nrm, rast_out[..., -1] |
| | return nrm |
| | |
| |
|