Przeglądaj źródła

D3D11 render target cleanup and example improvements

Karl Zylinski 3 miesięcy temu
rodzic
commit
31d67ea36e

+ 11 - 12
examples/render_texture/render_texture.odin

@@ -28,9 +28,8 @@ main :: proc() {
 
 	k2.init(1080, 1080, "Karl2D Render Texture Example")
 	k2.set_window_position(300, 100)
-	tex := k2.load_texture_from_file("sixten.jpg")
 
-	render_texture := k2.create_render_texture(200, 200)
+	render_texture := k2.create_render_texture(128, 128)
 
 	for !k2.shutdown_wanted() {
 		k2.process_events()
@@ -38,24 +37,24 @@ main :: proc() {
 		k2.set_render_texture(render_texture)
 		k2.clear(k2.BLUE)
 
-		k2.draw_rect({10, 10, 60, 60}, k2.GREEN)
-		k2.draw_rect({20, 20, 40, 40}, k2.BLACK)
-		k2.draw_circle({120, 40}, 30, k2.BLACK)
-		k2.draw_circle({120, 40}, 20, k2.GREEN)
-		k2.draw_text("Hellöpe!", {10, 100}, 64, k2.WHITE)
-		k2.draw_texture_ex(tex, {0, 0, f32(tex.width), f32(tex.height)}, {10, 200, 900, 500}, {}, 0)
-
+		k2.draw_rect({1, 1, 12, 12}, k2.GREEN)
+		k2.draw_rect({2, 2, 10, 10}, k2.BLACK)
+		k2.draw_circle({20, 7}, 6, k2.BLACK)
+		k2.draw_circle({20, 7}, 5, k2.GREEN)
+		k2.draw_text("Hellöpe!", {1, 20}, 20, k2.WHITE)
+		
 		k2.set_render_texture(nil)
 
 		k2.clear(k2.GRAY)
-		k2.draw_texture(render_texture.texture, {20, 20}, k2.WHITE)
-		k2.draw_texture(render_texture.texture, {100, 500}, k2.WHITE)
+		k2.draw_texture_ex(render_texture.texture, {0, 0, 128, 128}, {0, 0, 1080, 1080}, {}, 0, k2.WHITE)
 		k2.draw_texture(render_texture.texture, {400, 20}, k2.WHITE)
+		k2.draw_texture_ex(render_texture.texture, {0, 0, 128, 128}, {512, 512, 512, 512}, {}, 70, k2.WHITE)
 
 		k2.present()
 		free_all(context.temp_allocator)
 	}
 
-	k2.destroy_texture(tex)
+	k2.destroy_render_texture(render_texture)
+
 	k2.shutdown()
 }

+ 5 - 0
karl2d.odin

@@ -854,6 +854,11 @@ create_render_texture :: proc(width: int, height: int) -> Render_Texture {
 	}
 }
 
+destroy_render_texture :: proc(render_texture: Render_Texture) {
+	rb.destroy_texture(render_texture.texture.handle)
+	rb.destroy_render_target(render_texture.render_target)
+}
+
 set_render_texture :: proc(render_texture: Maybe(Render_Texture)) {
 	if rt, rt_ok := render_texture.?; rt_ok {
 		if s.batch_render_target == rt.render_target {

+ 13 - 2
render_backend_d3d11.odin

@@ -22,6 +22,7 @@ RENDER_BACKEND_INTERFACE_D3D11 :: Render_Backend_Interface {
 	update_texture = d3d11_update_texture,
 	destroy_texture = d3d11_destroy_texture,
 	create_render_texture = d3d11_create_render_texture,
+	destroy_render_target = d3d11_destroy_render_target,
 	set_texture_filter = d3d11_set_texture_filter,
 	load_shader = d3d11_load_shader,
 	destroy_shader = d3d11_destroy_shader,
@@ -135,8 +136,8 @@ d3d11_init :: proc(state: rawptr, window_handle: Window_Handle, swapchain_width,
 				SrcBlend = .SRC_ALPHA,
 				DestBlend = .INV_SRC_ALPHA,
 				BlendOp = .ADD,
-				SrcBlendAlpha = .ONE,
-				DestBlendAlpha = .ZERO,
+				SrcBlendAlpha = .SRC_ALPHA,
+				DestBlendAlpha = .INV_SRC_ALPHA,
 				BlendOpAlpha = .ADD,
 				RenderTargetWriteMask = u8(d3d11.COLOR_WRITE_ENABLE_ALL),
 			},
@@ -463,6 +464,16 @@ d3d11_create_render_texture :: proc(width: int, height: int) -> (Texture_Handle,
 	return hm.add(&s.textures, d3d11_texture), hm.add(&s.render_targets, d3d11_render_target)
 }
 
+d3d11_destroy_render_target :: proc(render_target: Render_Target_Handle) {
+	if rt := hm.get(&s.render_targets, render_target); rt != nil {
+		rt.depth_stencil_texture->Release()
+		rt.depth_stencil_texture_view->Release()	
+		rt.render_target_view->Release()
+	}
+
+	hm.remove(&s.render_targets, render_target)
+}
+
 d3d11_load_texture :: proc(data: []u8, width: int, height: int, format: Pixel_Format) -> Texture_Handle {
 	return create_texture(width, height, format, raw_data(data))
 }

+ 5 - 0
render_backend_gl.odin

@@ -21,6 +21,7 @@ RENDER_BACKEND_INTERFACE_GL :: Render_Backend_Interface {
 	update_texture = gl_update_texture,
 	destroy_texture = gl_destroy_texture,
 	create_render_texture = gl_create_render_texture,
+	destroy_render_target = gl_destroy_render_target,
 	set_texture_filter = gl_set_texture_filter,
 	load_shader = gl_load_shader,
 	destroy_shader = gl_destroy_shader,
@@ -384,6 +385,10 @@ gl_create_render_texture :: proc(width: int, height: int) -> (Texture_Handle, Re
 	return {}, {}
 }
 
+gl_destroy_render_target :: proc(render_target: Render_Target_Handle) {
+	
+}
+
 gl_set_texture_filter :: proc(
 	th: Texture_Handle,
 	scale_down_filter: Texture_Filter,

+ 1 - 0
render_backend_interface.odin

@@ -38,6 +38,7 @@ Render_Backend_Interface :: struct #all_or_none {
 	destroy_texture: proc(handle: Texture_Handle),
 
 	create_render_texture: proc(width: int, height: int) -> (Texture_Handle, Render_Target_Handle),
+	destroy_render_target: proc(render_texture: Render_Target_Handle),
 	
 	set_texture_filter: proc(
 		handle: Texture_Handle,