Przeglądaj źródła

Multitexture example

Karl Zylinski 3 miesięcy temu
rodzic
commit
5b53bd7367

+ 14 - 0
examples/multitexture/gl_multitexture_fragment_shader.glsl

@@ -0,0 +1,14 @@
+#version 330
+in vec2 frag_texcoord;
+in vec4 frag_color;
+out vec4 final_color;
+
+uniform sampler2D tex;
+uniform sampler2D tex2;
+
+void main()
+{
+    vec4 c = texture(tex, frag_texcoord);
+    vec4 c2 = texture(tex2, frag_texcoord);
+    final_color = c * frag_color * c2;
+}

+ 16 - 0
examples/multitexture/gl_multitexture_vertex_shader.glsl

@@ -0,0 +1,16 @@
+#version 330
+layout(location = 0) in vec3 position;
+layout(location = 1) in vec2 texcoord;
+layout(location = 2) in vec4 color;
+
+out vec2 frag_texcoord;
+out vec4 frag_color;
+
+uniform mat4 mvp;
+
+void main()
+{
+    frag_texcoord = texcoord;
+    frag_color = color;
+    gl_Position = mvp * vec4(position, 1.0);
+}

+ 62 - 0
examples/multitexture/multitexture.odin

@@ -0,0 +1,62 @@
+package karl2d_multitexture_example
+
+import k2 "../.."
+import "core:mem"
+import "core:log"
+import "core:fmt"
+
+_ :: fmt
+_ :: mem
+
+main :: proc() {
+	context.logger = log.create_console_logger()
+
+	when ODIN_DEBUG {
+		track: mem.Tracking_Allocator
+		mem.tracking_allocator_init(&track, context.allocator)
+		context.allocator = mem.tracking_allocator(&track)
+
+		defer {
+			if len(track.allocation_map) > 0 {
+				for _, entry in track.allocation_map {
+					fmt.eprintf("%v leaked: %v bytes\n", entry.location, entry.size)
+				}
+			}
+			mem.tracking_allocator_destroy(&track)
+		}
+	}
+
+	k2.init(1080, 1080, "Karl2D Multitexture Example")
+	k2.set_window_position(300, 100)
+	when k2.CUSTOM_RENDER_BACKEND_STR == "gl" {
+		shd := k2.load_shader_from_file("gl_multitexture_vertex_shader.glsl", "gl_multitexture_fragment_shader.glsl")
+	} else {
+		shd := k2.load_shader_from_file("multitexture_shader.hlsl", "multitexture_shader.hlsl")	
+	}
+	
+	tex1 := k2.load_texture_from_file("../minimal/sixten.jpg")
+	tex2 := k2.load_texture_from_file("../snake/food.png")
+
+	shd.texture_bindpoints[shd.texture_lookup["tex2"]] = tex2.handle
+
+	for !k2.shutdown_wanted() {
+		k2.process_events()
+		k2.set_shader(shd)
+		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(tex1, {0, 0, f32(tex1.width), f32(tex1.height)}, {10, 200, 900, 500}, {}, 0)
+
+		k2.present()
+		free_all(context.temp_allocator)
+	}
+
+	k2.destroy_texture(tex1)
+	k2.destroy_texture(tex2)
+	k2.destroy_shader(shd)
+	k2.shutdown()
+}

+ 29 - 0
examples/multitexture/multitexture_shader.hlsl

@@ -0,0 +1,29 @@
+cbuffer constants : register(b0) {
+	float4x4 mvp;
+}
+struct vs_in {
+	float3 position : position;
+	float2 texcoord : texcoord;
+	float4 color    : color;
+};
+struct vs_out {
+	float4 position : SV_POSITION;
+	float2 texcoord : texcoord;
+	float4 color    : color;
+};
+Texture2D    tex : register(t0);
+SamplerState smp : register(s0);
+Texture2D    tex2 : register(t1);
+SamplerState smp2 : register(s1);
+vs_out vs_main(vs_in input) {
+	vs_out output;
+	output.position = mul(mvp, float4(input.position, 1.0f));
+	output.texcoord = input.texcoord;
+	output.color = input.color;
+	return output;
+}
+float4 ps_main(vs_out input) : SV_TARGET {
+	float4 c = tex.Sample(smp, input.texcoord);
+	float4 c2 = tex2.Sample(smp2, input.texcoord);
+	return c * input.color * c2;
+}