def create(self): # Construct the voxel texture self._cloud_voxels = Image.create_3d("CloudVoxels", self._voxel_res_xy, self._voxel_res_xy, self._voxel_res_z, "RGBA8") self._cloud_voxels.set_wrap_u(SamplerState.WM_repeat) self._cloud_voxels.set_wrap_v(SamplerState.WM_repeat) self._cloud_voxels.set_wrap_w(SamplerState.WM_border_color) self._cloud_voxels.set_border_color(Vec4(0, 0, 0, 0)) # Construct the target which populates the voxel texture self._grid_target = self.create_target("CreateVoxels") self._grid_target.size = self._voxel_res_xy, self._voxel_res_xy self._grid_target.prepare_buffer() self._grid_target.quad.set_instance_count(self._voxel_res_z) self._grid_target.set_shader_input("CloudVoxels", self._cloud_voxels) # Construct the target which shades the voxels self._shade_target = self.create_target("ShadeVoxels") self._shade_target.size = self._voxel_res_xy, self._voxel_res_xy self._shade_target.prepare_buffer() self._shade_target.quad.set_instance_count(self._voxel_res_z) self._shade_target.set_shader_input("CloudVoxels", self._cloud_voxels) self._shade_target.set_shader_input("CloudVoxelsDest", self._cloud_voxels)
def _create_storage(self): """ Internal method to create the storage for the profile dataset textures """ self._storage_tex = Image.create_3d("IESDatasets", 512, 512, self._max_entries, "R16") self._storage_tex.set_minfilter(SamplerState.FT_linear) self._storage_tex.set_magfilter(SamplerState.FT_linear) self._storage_tex.set_wrap_u(SamplerState.WM_clamp) self._storage_tex.set_wrap_v(SamplerState.WM_repeat) self._storage_tex.set_wrap_w(SamplerState.WM_clamp) self._pipeline.stage_mgr.inputs["IESDatasetTex"] = self._storage_tex self._pipeline.stage_mgr.defines["MAX_IES_PROFILES"] = self._max_entries
def _create_storage(self): """ Internal method to create the storage for the profile dataset textures """ self._storage_tex = Image.create_3d("IESDatasets", 512, 512, self._max_entries, "R16") self._storage_tex.set_minfilter(SamplerState.FT_linear) self._storage_tex.set_magfilter(SamplerState.FT_linear) self._storage_tex.set_wrap_u(SamplerState.WM_clamp) self._storage_tex.set_wrap_v(SamplerState.WM_repeat) self._storage_tex.set_wrap_w(SamplerState.WM_clamp) self._pipeline.stage_mgr.inputs["IESDatasetTex"] = self._storage_tex self._pipeline.stage_mgr.defines["MAX_IES_PROFILES"] = self._max_entries
def create(self): # Construct the voxel texture self._cloud_voxels = Image.create_3d( "CloudVoxels", self._voxel_res_xy, self._voxel_res_xy, self._voxel_res_z, "RGBA8") self._cloud_voxels.set_wrap_u(SamplerState.WM_repeat) self._cloud_voxels.set_wrap_v(SamplerState.WM_repeat) self._cloud_voxels.set_wrap_w(SamplerState.WM_border_color) self._cloud_voxels.set_border_color(Vec4(0, 0, 0, 0)) # Construct the target which populates the voxel texture self._grid_target = self.create_target("CreateVoxels") self._grid_target.size = self._voxel_res_xy, self._voxel_res_xy self._grid_target.prepare_buffer() self._grid_target.quad.set_instance_count(self._voxel_res_z) self._grid_target.set_shader_input("CloudVoxels", self._cloud_voxels) # Construct the target which shades the voxels self._shade_target = self.create_target("ShadeVoxels") self._shade_target.size = self._voxel_res_xy, self._voxel_res_xy self._shade_target.prepare_buffer() self._shade_target.quad.set_instance_count(self._voxel_res_z) self._shade_target.set_shader_input("CloudVoxels", self._cloud_voxels) self._shade_target.set_shader_input("CloudVoxelsDest", self._cloud_voxels)
def create(self): # Create the voxel grid used to generate the voxels self.voxel_temp_grid = Image.create_3d("VoxelsTemp", self.voxel_resolution, self.voxel_resolution, self.voxel_resolution, "RGBA8") self.voxel_temp_grid.set_clear_color(Vec4(0)) self.voxel_temp_nrm_grid = Image.create_3d("VoxelsTemp", self.voxel_resolution, self.voxel_resolution, self.voxel_resolution, "R11G11B10") self.voxel_temp_nrm_grid.set_clear_color(Vec4(0)) # Create the voxel grid which is a copy of the temporary grid, but stable self.voxel_grid = Image.create_3d("Voxels", self.voxel_resolution, self.voxel_resolution, self.voxel_resolution, "RGBA8") self.voxel_grid.set_clear_color(Vec4(0)) self.voxel_grid.set_minfilter(SamplerState.FT_linear_mipmap_linear) # Create the camera for voxelization self.voxel_cam = Camera("VoxelizeCam") self.voxel_cam.set_camera_mask( self._pipeline.tag_mgr.get_voxelize_mask()) self.voxel_cam_lens = OrthographicLens() self.voxel_cam_lens.set_film_size(-2.0 * self.voxel_world_size, 2.0 * self.voxel_world_size) self.voxel_cam_lens.set_near_far(0.0, 2.0 * self.voxel_world_size) self.voxel_cam.set_lens(self.voxel_cam_lens) self.voxel_cam_np = Globals.base.render.attach_new_node(self.voxel_cam) self._pipeline.tag_mgr.register_camera("voxelize", self.voxel_cam) # Create the voxelization target self.voxel_target = self.create_target("VoxelizeScene") self.voxel_target.size = self.voxel_resolution self.voxel_target.prepare_render(self.voxel_cam_np) # Create the target which copies the voxel grid self.copy_target = self.create_target("CopyVoxels") self.copy_target.size = self.voxel_resolution self.copy_target.prepare_buffer() # TODO! Does not work with the new render target yet - maybe add option # to post process region for instances? self.copy_target.instance_count = self.voxel_resolution self.copy_target.set_shader_input("SourceTex", self.voxel_temp_grid) self.copy_target.set_shader_input("DestTex", self.voxel_grid) # Create the target which generates the mipmaps self.mip_targets = [] mip_size, mip = self.voxel_resolution, 0 while mip_size > 1: mip_size, mip = mip_size // 2, mip + 1 mip_target = self.create_target("GenMipmaps:" + str(mip)) mip_target.size = mip_size mip_target.prepare_buffer() mip_target.instance_count = mip_size mip_target.set_shader_input("SourceTex", self.voxel_grid) mip_target.set_shader_input("sourceMip", mip - 1) mip_target.set_shader_input("DestTex", self.voxel_grid, False, True, -1, mip, 0) self.mip_targets.append(mip_target) # Create the initial state used for rendering voxels initial_state = NodePath("VXGIInitialState") initial_state.set_attrib( CullFaceAttrib.make(CullFaceAttrib.M_cull_none), 100000) initial_state.set_attrib(DepthTestAttrib.make(DepthTestAttrib.M_none), 100000) initial_state.set_attrib(ColorWriteAttrib.make(ColorWriteAttrib.C_off), 100000) self.voxel_cam.set_initial_state(initial_state.get_state()) Globals.base.render.set_shader_input("voxelGridPosition", self.pta_next_grid_pos) Globals.base.render.set_shader_input("VoxelGridDest", self.voxel_temp_grid)
def create(self): # Create the voxel grid used to generate the voxels self.voxel_temp_grid = Image.create_3d( "VoxelsTemp", self.voxel_resolution, self.voxel_resolution, self.voxel_resolution, "RGBA8") self.voxel_temp_grid.set_clear_color(Vec4(0)) self.voxel_temp_nrm_grid = Image.create_3d( "VoxelsTemp", self.voxel_resolution, self.voxel_resolution, self.voxel_resolution, "R11G11B10") self.voxel_temp_nrm_grid.set_clear_color(Vec4(0)) # Create the voxel grid which is a copy of the temporary grid, but stable self.voxel_grid = Image.create_3d( "Voxels", self.voxel_resolution, self.voxel_resolution, self.voxel_resolution, "RGBA8") self.voxel_grid.set_clear_color(Vec4(0)) self.voxel_grid.set_minfilter(SamplerState.FT_linear_mipmap_linear) # Create the camera for voxelization self.voxel_cam = Camera("VoxelizeCam") self.voxel_cam.set_camera_mask(self._pipeline.tag_mgr.get_voxelize_mask()) self.voxel_cam_lens = OrthographicLens() self.voxel_cam_lens.set_film_size( -2.0 * self.voxel_world_size, 2.0 * self.voxel_world_size) self.voxel_cam_lens.set_near_far(0.0, 2.0 * self.voxel_world_size) self.voxel_cam.set_lens(self.voxel_cam_lens) self.voxel_cam_np = Globals.base.render.attach_new_node(self.voxel_cam) self._pipeline.tag_mgr.register_camera("voxelize", self.voxel_cam) # Create the voxelization target self.voxel_target = self.create_target("VoxelizeScene") self.voxel_target.size = self.voxel_resolution self.voxel_target.prepare_render(self.voxel_cam_np) # Create the target which copies the voxel grid self.copy_target = self.create_target("CopyVoxels") self.copy_target.size = self.voxel_resolution self.copy_target.prepare_buffer() # TODO! Does not work with the new render target yet - maybe add option # to post process region for instances? self.copy_target.instance_count = self.voxel_resolution self.copy_target.set_shader_input("SourceTex", self.voxel_temp_grid) self.copy_target.set_shader_input("DestTex", self.voxel_grid) # Create the target which generates the mipmaps self.mip_targets = [] mip_size, mip = self.voxel_resolution, 0 while mip_size > 1: mip_size, mip = mip_size // 2, mip + 1 mip_target = self.create_target("GenMipmaps:" + str(mip)) mip_target.size = mip_size mip_target.prepare_buffer() mip_target.instance_count = mip_size mip_target.set_shader_input("SourceTex", self.voxel_grid) mip_target.set_shader_input("sourceMip", mip - 1) mip_target.set_shader_input("DestTex", self.voxel_grid, False, True, -1, mip, 0) self.mip_targets.append(mip_target) # Create the initial state used for rendering voxels initial_state = NodePath("VXGIInitialState") initial_state.set_attrib(CullFaceAttrib.make(CullFaceAttrib.M_cull_none), 100000) initial_state.set_attrib(DepthTestAttrib.make(DepthTestAttrib.M_none), 100000) initial_state.set_attrib(ColorWriteAttrib.make(ColorWriteAttrib.C_off), 100000) self.voxel_cam.set_initial_state(initial_state.get_state()) Globals.base.render.set_shader_input("voxelGridPosition", self.pta_next_grid_pos) Globals.base.render.set_shader_input("VoxelGridDest", self.voxel_temp_grid)