1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| func _render_callback(effect_callback_type: int, render_data: RenderData) -> void: if not rd: return var scene_buffers : RenderSceneBuffersRD = render_data.get_render_scene_buffers() if not scene_buffers: return var size : Vector2i = scene_buffers.get_internal_size() if size.x == 0 or size.y == 0: return if scene_buffers.has_texture(context, texture_name_1): scene_buffers.clear_context(context) if !scene_buffers.has_texture(context, texture_name_1): var usage_bits : int = RenderingDevice.TEXTURE_USAGE_SAMPLING_BIT | RenderingDevice.TEXTURE_USAGE_STORAGE_BIT scene_buffers.create_texture(context, texture_name_1, RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT, usage_bits, RenderingDevice.TEXTURE_SAMPLES_1, size, 1, 1, true, true) scene_buffers.create_texture(context, texture_name_2, RenderingDevice.DATA_FORMAT_R16G16B16A16_SFLOAT, usage_bits, RenderingDevice.TEXTURE_SAMPLES_1, size, 1, 1, true, true) for view in scene_buffers.get_view_count(): var screen_texture : RID = scene_buffers.get_color_layer(view) var texture_layer_1 : RID = scene_buffers.get_texture_slice(context, texture_name_1, view, 0, 1, 1) var texture_layer_2 : RID = scene_buffers.get_texture_slice(context, texture_name_2, view, 0, 1, 1) var uniform : RDUniform = get_image_uniform(texture_layer_1, 0) var image_uniform_set : RID = UniformSetCacheRD.get_cache(shader, 0, [uniform]) uniform = get_sampler_uniform(screen_texture, 0) var sampler_uniform_set : RID = UniformSetCacheRD.get_cache(shader, 1, [uniform]) uniform = get_sampler_uniform_extra(texture_2_rid, 0) var sampler_uniform_set_2 : RID = UniformSetCacheRD.get_cache(shader, 2, [uniform]) var push_constants : PackedFloat32Array = PackedFloat32Array() var inv_proj_mat := render_data.get_render_scene_data().get_view_projection(view).inverse() var x_groups : int = size.x / 16 + 1 var y_groups : int = size.y / 16 + 1 push_constants.append(size.x) push_constants.append(size.y) push_constants.append(0.0) ... (下面这个只是我把projection推送到array的过程打包了以下) add_projection_to_array(push_constants, inv_proj_mat) var compute_list : int = rd.compute_list_begin() rd.compute_list_bind_compute_pipeline(compute_list, pipeline) rd.compute_list_bind_uniform_set(compute_list, image_uniform_set, 0) rd.compute_list_bind_uniform_set(compute_list, sampler_uniform_set, 1) rd.compute_list_bind_uniform_set(compute_list, sampler_uniform_set_2, 2) #rd.compute_list_bind_uniform_set(compute_list, image_uniform_set_2, 3) rd.compute_list_set_push_constant(compute_list, push_constants.to_byte_array(), push_constants.size() * 4) rd.compute_list_dispatch(compute_list, x_groups, y_groups, 1) rd.compute_list_end() uniform = get_image_uniform(texture_layer_1, 0) image_uniform_set = UniformSetCacheRD.get_cache(shader_layer1, 0, [uniform]) uniform = get_image_uniform(texture_layer_2, 0) sampler_uniform_set = UniformSetCacheRD.get_cache(shader_layer1, 1, [uniform]) x_groups = size.x / 16 + 1 y_groups = size.y / 16 + 1 push_constants.clear() push_constants.append(size.x) push_constants.append(size.y) push_constants.append(...) push_constants.append(0.0) compute_list = rd.compute_list_begin() rd.compute_list_bind_compute_pipeline(compute_list, pipline_1) rd.compute_list_bind_uniform_set(compute_list, image_uniform_set, 0) rd.compute_list_bind_uniform_set(compute_list, sampler_uniform_set, 1) rd.compute_list_set_push_constant(compute_list, push_constants.to_byte_array(), push_constants.size() * 4) rd.compute_list_dispatch(compute_list, x_groups, y_groups, 1) rd.compute_list_end()
(可以复用一个Pipeline,来实现参数不同的相同操作) (这里还有一个额外操作,得把buffer给Pingpong一下)
uniform = get_image_uniform(texture_layer_2, 0) image_uniform_set = UniformSetCacheRD.get_cache(shader_layer_1, 0, [uniform]) uniform = get_image_uniform(texture_layer_1, 0) sampler_uniform_set = UniformSetCacheRD.get_cache(shader_layer_1, 1, [uniform]) push_constants.clear() push_constants.append(size.x) push_constants.append(size.y) push_constants.append(0.0) push_constants.append(...) compute_list = rd.compute_list_begin() rd.compute_list_bind_compute_pipeline(compute_list, pipeline_blur) rd.compute_list_bind_uniform_set(compute_list, image_uniform_set, 0) rd.compute_list_bind_uniform_set(compute_list, sampler_uniform_set, 1) rd.compute_list_set_push_constant(compute_list, push_constants.to_byte_array(), push_constants.size() * 4) rd.compute_list_dispatch(compute_list, x_groups, y_groups, 1) rd.compute_list_end() ...(执行其他Pipeline)
|