(camera_state: CameraState, render_tab_state: RenderTabState)
| 122 | # register and open viewer |
| 123 | @torch.no_grad() |
| 124 | def viewer_render_fn(camera_state: CameraState, render_tab_state: RenderTabState): |
| 125 | assert isinstance(render_tab_state, GsplatRenderTabState) |
| 126 | if render_tab_state.preview_render: |
| 127 | width = render_tab_state.render_width |
| 128 | height = render_tab_state.render_height |
| 129 | else: |
| 130 | width = render_tab_state.viewer_width |
| 131 | height = render_tab_state.viewer_height |
| 132 | c2w = camera_state.c2w |
| 133 | K = camera_state.get_K((width, height)) |
| 134 | c2w = torch.from_numpy(c2w).float().to(device) |
| 135 | K = torch.from_numpy(K).float().to(device) |
| 136 | viewmat = c2w.inverse() |
| 137 | |
| 138 | RENDER_MODE_MAP = { |
| 139 | "rgb": "RGB", |
| 140 | "depth(accumulated)": "D", |
| 141 | "depth(expected)": "ED", |
| 142 | "alpha": "RGB", |
| 143 | } |
| 144 | |
| 145 | render_colors, render_alphas, info = rasterization( |
| 146 | means, # [N, 3] |
| 147 | quats, # [N, 4] |
| 148 | scales, # [N, 3] |
| 149 | opacities, # [N] |
| 150 | colors, # [N, S, 3] |
| 151 | viewmat[None], # [1, 4, 4] |
| 152 | K[None], # [1, 3, 3] |
| 153 | width, |
| 154 | height, |
| 155 | sh_degree=( |
| 156 | min(render_tab_state.max_sh_degree, sh_degree) |
| 157 | if sh_degree is not None |
| 158 | else None |
| 159 | ), |
| 160 | near_plane=render_tab_state.near_plane, |
| 161 | far_plane=render_tab_state.far_plane, |
| 162 | radius_clip=render_tab_state.radius_clip, |
| 163 | eps2d=render_tab_state.eps2d, |
| 164 | backgrounds=torch.tensor([render_tab_state.backgrounds], device=device) |
| 165 | / 255.0, |
| 166 | render_mode=RENDER_MODE_MAP[render_tab_state.render_mode], |
| 167 | rasterize_mode=render_tab_state.rasterize_mode, |
| 168 | camera_model=render_tab_state.camera_model, |
| 169 | packed=False, |
| 170 | with_ut=args.with_ut, |
| 171 | with_eval3d=args.with_eval3d, |
| 172 | ) |
| 173 | render_tab_state.total_gs_count = len(means) |
| 174 | render_tab_state.rendered_gs_count = (info["radii"] > 0).all(-1).sum().item() |
| 175 | |
| 176 | if render_tab_state.render_mode == "rgb": |
| 177 | # colors represented with sh are not guranteed to be in [0, 1] |
| 178 | render_colors = render_colors[0, ..., 0:3].clamp(0, 1) |
| 179 | renders = render_colors.cpu().numpy() |
| 180 | elif render_tab_state.render_mode in ["depth(accumulated)", "depth(expected)"]: |
| 181 | # normalize depth to [0, 1] |
nothing calls this directly
no test coverage detected
searching dependent graphs…