From f76516df47b248da030361052da020bc52e83161 Mon Sep 17 00:00:00 2001 From: Peter Li Date: Wed, 7 May 2025 10:05:44 -0700 Subject: [PATCH] bloom and shit --- engine/imgui/src/sgpu/backend_impl.zig | 2 + engine/rend/shaders/debug.frag.hlsl | 13 +- engine/rend/shaders/debug.frag.json | 5 + engine/rend/shaders/lit_mesh.frag.hlsl | 38 +-- engine/rend/shaders/lit_mesh.frag.json | 26 +- engine/rend/shaders/postProc.frag.hlsl | 95 ++++++- engine/rend/shaders/postProc.frag.json | 14 +- engine/rend/shaders/skybox.frag.hlsl | 23 +- engine/rend/shaders/skybox.frag.json | 26 ++ engine/rend/src/sgpu/DebugDrawSystem.zig | 6 +- engine/rend/src/sgpu/SkyboxSystem.zig | 50 +++- engine/rend/src/sgpu/renderer.zig | 252 +++++++++++------- extras/gameExtras/src/objectSpawner.zig | 16 +- .../content/_shaders/dxil/debug.frag.dxil | Bin 2844 -> 2996 bytes .../content/_shaders/dxil/lit_mesh.frag.dxil | Bin 7668 -> 7840 bytes .../content/_shaders/dxil/postProc.frag.dxil | Bin 3684 -> 4508 bytes .../content/_shaders/dxil/skybox.frag.dxil | Bin 3768 -> 4252 bytes projects/content/_shaders/msl/debug.frag.msl | 5 +- .../content/_shaders/msl/lit_mesh.frag.msl | 165 +++++++----- .../content/_shaders/msl/postProc.frag.msl | 27 +- projects/content/_shaders/msl/skybox.frag.msl | 14 +- projects/content/_shaders/spv/debug.frag.spv | Bin 492 -> 604 bytes .../content/_shaders/spv/lit_mesh.frag.spv | Bin 7108 -> 7652 bytes .../content/_shaders/spv/postProc.frag.spv | Bin 824 -> 2780 bytes projects/content/_shaders/spv/skybox.frag.spv | Bin 868 -> 1308 bytes projects/sampleGame/empire.zig | 57 ++++ projects/sampleGame/main.zig | 37 ++- 27 files changed, 628 insertions(+), 243 deletions(-) create mode 100644 projects/sampleGame/empire.zig diff --git a/engine/imgui/src/sgpu/backend_impl.zig b/engine/imgui/src/sgpu/backend_impl.zig index 41e6913..cd1c2cf 100644 --- a/engine/imgui/src/sgpu/backend_impl.zig +++ b/engine/imgui/src/sgpu/backend_impl.zig @@ -81,6 +81,8 @@ pub const Impl = struct { if (ig.begin("renderer debug", &self.rendererDebug, .{})) { _ = ig.sliderFloat("directional light yaw", &rend.context().directionalLightYaw, 0, 360, null, .{}); + _ = ig.sliderFloat("skyboxLevel", &rend.context().skyboxSystem.brightnessFactor, 0, 10, null, .{}); + _ = ig.sliderFloat("lightLevel", &rend.context().lightPower, 0, 100, null, .{}); _ = ig.sliderFloat("ortho near", &rend.context().shadowOrthoNear, 0, 200, null, .{}); _ = ig.sliderFloat("ortho far", &rend.context().shadowOrthoFar, 0, 6000, null, .{}); if (self.dtAverage > 0.000001) { diff --git a/engine/rend/shaders/debug.frag.hlsl b/engine/rend/shaders/debug.frag.hlsl index 0fb7dea..e2a33c2 100644 --- a/engine/rend/shaders/debug.frag.hlsl +++ b/engine/rend/shaders/debug.frag.hlsl @@ -1,4 +1,13 @@ -float4 main(float3 Color : TEXCOORD0) : SV_Target0 +struct PixelOutput { + float4 Color : SV_Target0; // First render target + float4 Emissive : SV_Target1; // Second render target +}; + +PixelOutput main(float3 Color : TEXCOORD0) { - return float4(Color, 1.0); + PixelOutput o; + o.Color = float4(Color * 4, 1.0); + o.Emissive = float4(Color * 4, 1.0); + + return o; } diff --git a/engine/rend/shaders/debug.frag.json b/engine/rend/shaders/debug.frag.json index 3691330..3105a05 100644 --- a/engine/rend/shaders/debug.frag.json +++ b/engine/rend/shaders/debug.frag.json @@ -17,6 +17,11 @@ "type" : "vec4", "name" : "out.var.SV_Target0", "location" : 0 + }, + { + "type" : "vec4", + "name" : "out.var.SV_Target1", + "location" : 1 } ] } \ No newline at end of file diff --git a/engine/rend/shaders/lit_mesh.frag.hlsl b/engine/rend/shaders/lit_mesh.frag.hlsl index 4ba7820..c2a7ff7 100644 --- a/engine/rend/shaders/lit_mesh.frag.hlsl +++ b/engine/rend/shaders/lit_mesh.frag.hlsl @@ -17,6 +17,7 @@ cbuffer Uniforms : register(b0, space3) float4 directionalLight; float4 directionalLightColor; float2 screenSize; + float lightPower; float time; }; @@ -173,17 +174,12 @@ float3 DirectionalLight(float3 normal, float3 fragPos, float4 DirectionalShadow return diffuse; } -float3 reinhard2(float3 x) { - const float L_white = 4.0; +struct PixelOutput { + float4 Color : SV_Target0; // First render target + float4 Emissive : SV_Target1; // Second render target +}; - const float3 a = 1.0 + x / (L_white * L_white); - const float3 x2 = x * a; - const float3 x3 = 1.0 + x; - return x2 / x3; -} - - -float4 main( +PixelOutput main( float4 ScreenPosition: SV_POSITION, float2 UV : TEXCOORD0, @@ -191,9 +187,7 @@ float4 main( float3 Normal: TEXCOORD2, float4 DirectionalShadowFragPos: TEXCOORD3, uint Instance: TEXCOORD4 -) : SV_Target0 -{ - +) { float4 s; @@ -237,7 +231,7 @@ float4 main( } float3 lightPos = lightPosition.xyz; //+ float3(0, 20, 0); - float3 lightColor = float3(0.8, 0.8, 0.5); + float3 lightColor = float3(0.8, 0.8, 0.5) * lightPower; float3 ambient = float3(0.1,0.1,0.1); @@ -249,11 +243,21 @@ float4 main( if((texMode & 0x2) > 0) // full bright no lighting bit { - c2 = col * 4; + c2 = col * 2.0; } + // float4 rv = float4(pow(c2, 1.0 / 2.2), alpha); + float4 rv = float4(c2, alpha); - float4 rv = float4(pow(c2, 1.0 / 2.2), alpha); + PixelOutput o; + + o.Color = float4(c2, alpha); + o.Emissive = float4(0.0, 0.0, 0.0, 1.0); + if(c2.x > 1.0) o.Emissive.x = c2.x; + if(c2.y > 1.0) o.Emissive.y = c2.y; + if(c2.z > 1.0) o.Emissive.z = c2.z; + + return o; // === debug bone zone // float3 shadowProjection = DirectionalShadowFragPos.xyz / DirectionalShadowFragPos.w; @@ -273,6 +277,6 @@ float4 main( // rv.x = rv.x + lightPos.x * 0.0001; - return rv; + // return rv; } diff --git a/engine/rend/shaders/lit_mesh.frag.json b/engine/rend/shaders/lit_mesh.frag.json index 3d4f16b..d5c016a 100644 --- a/engine/rend/shaders/lit_mesh.frag.json +++ b/engine/rend/shaders/lit_mesh.frag.json @@ -6,7 +6,7 @@ } ], "types" : { - "_19" : { + "_20" : { "name" : "type.Uniforms", "members" : [ { @@ -35,13 +35,18 @@ "offset" : 64 }, { - "name" : "time", + "name" : "lightPower", "type" : "float", "offset" : 72 + }, + { + "name" : "time", + "type" : "float", + "offset" : 76 } ] }, - "_22" : { + "_23" : { "name" : "Scene", "members" : [ { @@ -73,12 +78,12 @@ } ] }, - "_21" : { + "_22" : { "name" : "type.StructuredBuffer.Scene", "members" : [ { "name" : "_m0", - "type" : "_22", + "type" : "_23", "array" : [ 0 ], @@ -123,6 +128,11 @@ "type" : "vec4", "name" : "out.var.SV_Target0", "location" : 0 + }, + { + "type" : "vec4", + "name" : "out.var.SV_Target1", + "location" : 1 } ], "separate_images" : [ @@ -179,7 +189,7 @@ ], "ssbos" : [ { - "type" : "_21", + "type" : "_22", "name" : "scene", "readonly" : true, "block_size" : 0, @@ -189,9 +199,9 @@ ], "ubos" : [ { - "type" : "_19", + "type" : "_20", "name" : "type.Uniforms", - "block_size" : 76, + "block_size" : 80, "set" : 3, "binding" : 0 } diff --git a/engine/rend/shaders/postProc.frag.hlsl b/engine/rend/shaders/postProc.frag.hlsl index 0d2452a..0f6fb0b 100644 --- a/engine/rend/shaders/postProc.frag.hlsl +++ b/engine/rend/shaders/postProc.frag.hlsl @@ -1,12 +1,101 @@ -Texture2D Texture0 : register(t0, space2); +Texture2D ColorTexture : register(t0, space2); SamplerState Sampler0 : register(s0, space2); +Texture2D EmissiveTexture : register(t1, space2); +SamplerState Sampler1 : register(s1, space2); + +float3 reinhard2(float3 x) { + const float L_white = 10.0; + + const float3 a = 1.0 + x / (L_white * L_white); + const float3 x2 = x * a; + const float3 x3 = 1.0 + x; + return x2 / x3; +} + +float3 blur(float2 uv) +{ + const float offset[5] = {0.0, 1.0, 2.0, 3.0, 4.0}; + const float weight[5] = {0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162}; + + float3 c = EmissiveTexture.Sample(Sampler1, uv).xyz * weight[0]; + + for(int j = 0; j < 5; j++ ) + { + for(int i = 0; i < 5; i++ ) + { + { + float2 uv2 = uv + float2(j - 2.5, i) / 512; + float3 s = EmissiveTexture.Sample(Sampler1, uv2).xyz / 25; + c += s; + } + + { + float2 uv2 = uv - float2(j - 2.5, i) / 512; + float3 s = EmissiveTexture.Sample(Sampler1, uv2).xyz / 25; + c += s; + } +#if 0 + { + float2 uv2 = uv + float2(0.0, offset[i]) / 1024; + float3 s = EmissiveTexture.Sample(Sampler1, uv2).xyz * weight[i]; + c += s; + } + + { + float2 uv2 = uv - float2(0.0, offset[i]) / 1024; + float3 s = EmissiveTexture.Sample(Sampler1, uv2).xyz * weight[i]; + c += s; + } +#endif + } + } + + return c; + +} + float4 main(float2 UV : TEXCOORD0) : SV_Target0 { float2 uv = UV; uv.y *= -1; + uv.y += 1.0; - float4 color = Texture0.Sample(Sampler0, uv); + float3 c; - return color; +#if 0 + { + c = ColorTexture.Sample(Sampler0, uv).xyz; + c = reinhard2(c); + c = pow(c, 1.0/2.2); + } +#endif + + c = ColorTexture.Sample(Sampler0, uv).xyz; + c = reinhard2(c); + + float3 b = float3(0.0, 0.0, 0.0); + + if(length(c) < 1.0) + { + b = blur(uv) * 0.3; + } + + c = pow(c, 1.0/2.2); + + float3 e = EmissiveTexture.Sample(Sampler1, uv).xyz; + + c = c + blur(uv) * 0.05; + + float exposure = 1.0; + c *= exposure;//= exposure(c, 1.0, 0.3); + + // c = e; + + // c = float3(uv.x, uv.y, 0.0); + + c.x *= 1.0 + 0.000001 * EmissiveTexture.Sample(Sampler1, uv).x; + c.x *= 1.0 + 0.000001 * ColorTexture.Sample(Sampler0, uv).x; + + return float4(c, 1.0); } diff --git a/engine/rend/shaders/postProc.frag.json b/engine/rend/shaders/postProc.frag.json index e0a47ec..537472b 100644 --- a/engine/rend/shaders/postProc.frag.json +++ b/engine/rend/shaders/postProc.frag.json @@ -22,9 +22,15 @@ "separate_images" : [ { "type" : "texture2D", - "name" : "Texture0", + "name" : "ColorTexture", "set" : 2, "binding" : 0 + }, + { + "type" : "texture2D", + "name" : "EmissiveTexture", + "set" : 2, + "binding" : 1 } ], "separate_samplers" : [ @@ -33,6 +39,12 @@ "name" : "Sampler0", "set" : 2, "binding" : 0 + }, + { + "type" : "sampler", + "name" : "Sampler1", + "set" : 2, + "binding" : 1 } ] } \ No newline at end of file diff --git a/engine/rend/shaders/skybox.frag.hlsl b/engine/rend/shaders/skybox.frag.hlsl index 012bb87..bc43e06 100644 --- a/engine/rend/shaders/skybox.frag.hlsl +++ b/engine/rend/shaders/skybox.frag.hlsl @@ -1,8 +1,27 @@ TextureCube SkyboxTexture : register(t0, space2); SamplerState SkyboxSampler : register(s0, space2); -float4 main(float3 TexCoord : TEXCOORD0) : SV_Target0 +cbuffer Uniforms : register(b0, space3) { - return pow(SkyboxTexture.Sample(SkyboxSampler, TexCoord), 1.0/2.2); + float brightnessFactor; +}; + +struct PixelOutput { + float4 Color : SV_Target0; // First render target + float4 Emissive : SV_Target1; // Second render target +}; + +PixelOutput main(float3 TexCoord : TEXCOORD0) +{ + //return pow(SkyboxTexture.Sample(SkyboxSampler, TexCoord) * 4.0, 1.0/2.2); + PixelOutput o; + o.Color = SkyboxTexture.Sample(SkyboxSampler, TexCoord) * brightnessFactor; + + if(length(o.Color) > 1.0) + { + o.Emissive = o.Color; + } + + return o; } diff --git a/engine/rend/shaders/skybox.frag.json b/engine/rend/shaders/skybox.frag.json index fcf3482..c153f86 100644 --- a/engine/rend/shaders/skybox.frag.json +++ b/engine/rend/shaders/skybox.frag.json @@ -5,6 +5,18 @@ "mode" : "frag" } ], + "types" : { + "_10" : { + "name" : "type.Uniforms", + "members" : [ + { + "name" : "brightnessFactor", + "type" : "float", + "offset" : 0 + } + ] + } + }, "inputs" : [ { "type" : "vec3", @@ -17,6 +29,11 @@ "type" : "vec4", "name" : "out.var.SV_Target0", "location" : 0 + }, + { + "type" : "vec4", + "name" : "out.var.SV_Target1", + "location" : 1 } ], "separate_images" : [ @@ -34,5 +51,14 @@ "set" : 2, "binding" : 0 } + ], + "ubos" : [ + { + "type" : "_10", + "name" : "type.Uniforms", + "block_size" : 4, + "set" : 3, + "binding" : 0 + } ] } \ No newline at end of file diff --git a/engine/rend/src/sgpu/DebugDrawSystem.zig b/engine/rend/src/sgpu/DebugDrawSystem.zig index a93de37..8a82ba7 100644 --- a/engine/rend/src/sgpu/DebugDrawSystem.zig +++ b/engine/rend/src/sgpu/DebugDrawSystem.zig @@ -194,12 +194,16 @@ pub fn createPipeline(self: *@This()) !*gpu.GPUGraphicsPipeline { pci.target_info.has_depth_stencil_target = true; pci.target_info.depth_stencil_format = rend.context().depthFormat; - pci.target_info.num_color_targets = 1; + pci.target_info.num_color_targets = 2; pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{ .{ .format = rend.context().hdrTextureFormat, .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), }, + .{ + .format = rend.context().hdrTextureFormat, + .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), + }, }; pci.rasterizer_state.fill_mode = .fillmodeLine; diff --git a/engine/rend/src/sgpu/SkyboxSystem.zig b/engine/rend/src/sgpu/SkyboxSystem.zig index 8ff755b..d126b27 100644 --- a/engine/rend/src/sgpu/SkyboxSystem.zig +++ b/engine/rend/src/sgpu/SkyboxSystem.zig @@ -12,6 +12,8 @@ skyboxColor: core.colors.Color = .{ .r = 71.0 / 256.0, .g = 200.0 / 256.0, .b = skyboxMeshName: core.Name = core.DefineName("m_skybox"), +brightnessFactor: f32 = 4.0, + sampler: *gpu.GPUSampler = undefined, pub fn create(allocator: std.mem.Allocator) !*@This() { @@ -58,12 +60,16 @@ fn createPipeline(self: *@This()) !void { .vertex_attributes = @ptrCast(attributes.items.ptr), }; - pci.target_info.num_color_targets = 1; + pci.target_info.num_color_targets = 2; pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{ .{ .format = ctx.hdrTextureFormat, .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), }, + .{ + .format = ctx.hdrTextureFormat, + .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), + }, }; pci.rasterizer_state.fill_mode = .fillmodeFill; @@ -84,12 +90,20 @@ pub fn destroy(self: *@This()) void { } pub fn render(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { - const targetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ - .texture = rend.context().state.targetTexture, - .clear_color = self.skyboxColor, - .load_op = .loadopClear, - .store_op = .storeopStore, - }); + const targetInfo: [2]gpu.GPUColorTargetInfo = .{ + std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ + .texture = rend.context().state.targetTexture, + .clear_color = self.skyboxColor, + .load_op = .loadopClear, + .store_op = .storeopStore, + }), + std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ + .texture = rend.context().state.emissiveTarget, + .clear_color = .{}, + .load_op = .loadopClear, + .store_op = .storeopStore, + }), + }; if (self.skyboxMesh == null) { self.skyboxMesh = rend.getMeshByName(&self.skyboxMeshName); @@ -101,7 +115,7 @@ pub fn render(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { } } - const renderpass = cmd.beginGPURenderPass(&targetInfo, 1, null); + const renderpass = cmd.beginGPURenderPass(&targetInfo, 2, null); if (self.skyboxTexture) |skyboxTexture| { if (self.skyboxMesh) |skyboxMesh| { @@ -122,16 +136,24 @@ pub fn render(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { } pub fn uploadSkyboxUniforms(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { - _ = self; + { + var data = std.mem.zeroes([@sizeOf(skybox_vert.Uniforms) / 8 + 1]usize); + const ptr: *skybox_vert.Uniforms = @ptrCast(@alignCast(&data)); - var data = std.mem.zeroes([@sizeOf(skybox_vert.Uniforms) / 8 + 1]usize); - const ptr: *skybox_vert.Uniforms = @ptrCast(@alignCast(&data)); + if (rend.context().activeCamera) |camera| { + ptr.ViewProjection = @bitCast(camera.noTranslate); + } - if (rend.context().activeCamera) |camera| { - ptr.ViewProjection = @bitCast(camera.noTranslate); + cmd.pushGPUVertexUniformData(0, &data, @sizeOf(skybox_vert.Uniforms)); } - cmd.pushGPUVertexUniformData(0, &data, @sizeOf(skybox_vert.Uniforms)); + { + var data = std.mem.zeroes([@sizeOf(skybox_vert.Uniforms) / 8 + 1]usize); + const ptr: *skybox_frag.Uniforms = @ptrCast(@alignCast(&data)); + ptr.brightnessFactor = self.brightnessFactor; + + cmd.pushGPUFragmentUniformData(0, &data, @sizeOf(skybox_vert.Uniforms)); + } } const skybox_mesh_obj align(8) = @embedFile("embedded/skybox.obj").*; diff --git a/engine/rend/src/sgpu/renderer.zig b/engine/rend/src/sgpu/renderer.zig index c781c51..6d87ed8 100644 --- a/engine/rend/src/sgpu/renderer.zig +++ b/engine/rend/src/sgpu/renderer.zig @@ -44,6 +44,7 @@ pub const Renderer = struct { shadowMapProjection: core.Transform = core.zm.identity(), blockySampler: *gpu.GPUSampler = undefined, + linearSampler: *gpu.GPUSampler = undefined, cubeSampler: *gpu.GPUSampler = undefined, defaultTexture: *rend.Texture = undefined, @@ -78,6 +79,8 @@ pub const Renderer = struct { screenPlane: ?rend.IndexedMesh = null, + lightPower: f32 = 4.0, + pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This()); pub const MaxObjectCount = 50000; @@ -112,6 +115,7 @@ pub const Renderer = struct { }; self.state.targetTexture = self.device.createGPUTexture(&gci); + self.state.emissiveTarget = self.device.createGPUTexture(&gci); } pub fn startRenderer(self: *@This()) !void { @@ -167,7 +171,6 @@ pub const Renderer = struct { self.skyboxSystem = try self.createRendererEngineObject(SkyboxSystem); _ = try core.fs().installFileBytesMount("embedded:plane.obj", @constCast(&plane_obj), true); - _ = try core.fs().installFileBytesMount("embedded:screenPlane.obj", @constCast(&screenPlane_obj), true); try assets.load( @@ -237,6 +240,21 @@ pub const Renderer = struct { .address_mode_v = .sampleraddressmodeRepeat, .address_mode_w = .sampleraddressmodeRepeat, })); + + self.linearSampler = self.device.createGPUSampler(&std.mem.zeroInit(gpu.GPUSamplerCreateInfo, .{ + .min_filter = .filterLinear, + .mag_filter = .filterLinear, + .mipmap_mode = .samplermipmapmodeNearest, + // .address_mode_u = .sampleraddressmodeMirroredRepeat, + // .address_mode_v = .sampleraddressmodeMirroredRepeat, + // .address_mode_w = .sampleraddressmodeMirroredRepeat, + // .address_mode_u = .sampleraddressmodeRepeat, + // .address_mode_v = .sampleraddressmodeRepeat, + // .address_mode_w = .sampleraddressmodeRepeat, + .address_mode_u = .sampleraddressmodeClampToEdge, + .address_mode_v = .sampleraddressmodeClampToEdge, + .address_mode_w = .sampleraddressmodeClampToEdge, + })); } // registers a pre-existing render object, does not add to destroys @@ -416,8 +434,12 @@ pub const Renderer = struct { core.graphics_log("swapchain format: {any}", .{self.swapchainTargetFormat}); pci.target_info.has_depth_stencil_target = true; pci.target_info.depth_stencil_format = self.depthFormat; - pci.target_info.num_color_targets = 1; - pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{ + pci.target_info.num_color_targets = 2; + pci.target_info.color_target_descriptions = &[2]gpu.GPUColorTargetDescription{ + .{ + .format = self.hdrTextureFormat, + .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), + }, .{ .format = self.hdrTextureFormat, .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState), @@ -553,6 +575,7 @@ pub const Renderer = struct { ptr.lightPosition = @bitCast(self.lightPosition.toZm()); ptr.directionalLight = @bitCast(resolved.toZm()); ptr.directionalLightColor = @bitCast(self.directionalLightColor); + ptr.lightPower = self.lightPower; cmd.pushGPUFragmentUniformData(0, &data, @sizeOf(lit_mesh_frag.Uniforms)); } } @@ -597,8 +620,13 @@ pub const Renderer = struct { } pub fn tick(self: *@This(), dt: f64) void { + var z = tracy.ZoneN(@src(), "renderer tick"); + + defer z.End(); + self.totalTime += dt; + var z2 = tracy.ZoneN(@src(), "Uploads and Updates"); self.state.cmd = self.device.acquireGPUCommandBuffer(); self.frameUploads(); @@ -621,8 +649,11 @@ pub const Renderer = struct { for (self.preDraws.items) |interface| { interface.func(interface.ptr, self.state.cmd.?); } + z2.End(); + var z1 = tracy.ZoneN(@src(), "draw"); self.draw(); + z1.End(); } // orthographic view projection from the sun towards the center of the thing @@ -640,6 +671,9 @@ pub const Renderer = struct { } pub fn drawDirectionalShadowMap(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { + var z = tracy.ZoneN(@src(), "drawDirectionalShadowMap"); + defer z.End(); + { var data = std.mem.zeroes([@sizeOf(meshes_vert.Uniforms) / 8 + 1]usize); const ptr: *meshes_vert.Uniforms = @ptrCast(@alignCast(&data)); @@ -677,10 +711,117 @@ pub const Renderer = struct { renderpass.endGPURenderPass(); } + pub fn drawMeshes(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { + // can cache this + const targetInfo: [2]gpu.GPUColorTargetInfo = .{ + std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ + .texture = self.state.targetTexture, + .load_op = .loadopLoad, + .store_op = .storeopStore, + }), + std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ + .texture = self.state.emissiveTarget, + .load_op = .loadopClear, + .store_op = .storeopStore, + }), + }; + + const depthTarget = std.mem.zeroInit(gpu.GPUDepthStencilTargetInfo, .{ + .texture = self.depthTexture, + .load_op = .loadopClear, + .store_op = .storeopDontCare, + .stencil_load_op = .loadopDontCare, + .stencil_store_op = .storeopDontCare, + .clear_depth = 1.0, + .clear_stencil = 0, + }); + + self.state.pass = cmd.beginGPURenderPass(&targetInfo, 2, &depthTarget); + const renderpass = self.state.pass.?; + renderpass.setGPUScissor(&self.scissor); + + //renderpass.bindGPUGraphicsPipeline(self.testPipeline); + renderpass.bindGPUFragmentSamplers(1, &.{ .sampler = self.blockySampler, .texture = self.defaultTexture.texture }, 1); + renderpass.bindGPUFragmentSamplers(2, &.{ .sampler = self.blockySampler, .texture = self.defaultTexture.texture }, 1); + + renderpass.bindGPUVertexStorageBuffers(0, &self.ssboScene, 1); + renderpass.bindGPUFragmentStorageBuffers(0, &self.ssboScene, 1); + renderpass.bindGPUVertexBuffers(0, &.{ .buffer = self.meshPool.vertexBuffer, .offset = 0 }, 1); + renderpass.bindGPUIndexBuffer(&.{ .buffer = self.meshPool.indexBuffer, .offset = 0 }, .indexelementsize32bit); + + renderpass.bindGPUGraphicsPipeline(self.meshPipe); + renderpass.bindGPUFragmentSamplers(self.shadowDepthTextureSlot, &.{ .texture = self.shadowDepthTexture, .sampler = self.blockySampler }, 1); + + try self.uploadUniforms(cmd); + + //rendering each mesh + { + // placeholder textures + const container = rend.MeshComponent.BaseContainer; + const uploadCount: usize = @min(container.dense.items.len, MaxObjectCount); + for (0..uploadCount) |i| { + const component = &container.dense.items[i].value; + + var t = component.texture; + if (t == null) { + t = self.defaultTexture; + } + + if (component.mesh) |mesh| { + renderpass.bindGPUFragmentSamplers(0, &.{ .texture = t.?.texture, .sampler = self.blockySampler }, 1); + + if (component.cmrf) |cmrf| { + cmrf(component.cmrf_ctx); + } + + renderpass.drawGPUIndexedPrimitives(mesh.index.size, 1, mesh.index.start, @intCast(mesh.vertex.start), @intCast(i)); + } else {} + } + } + + for (self.postMesh.items) |interface| { + interface.func(interface.ptr, cmd, renderpass); + } + renderpass.endGPURenderPass(); + } + + pub fn drawPostProcess(self: *@This(), cmd: *gpu.GPUCommandBuffer) void { + const postProcTargetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ + .texture = self.state.swapchainTargetTexture.?, + .load_op = .loadopDontCare, + .store_op = .storeopStore, + }); + + const postProcPass = cmd.beginGPURenderPass(&postProcTargetInfo, 1, null); + + postProcPass.bindGPUGraphicsPipeline(self.postProcessingPipeline); + postProcPass.bindGPUFragmentSamplers(0, &[2]gpu.GPUTextureSamplerBinding{ + .{ .sampler = self.blockySampler, .texture = self.state.targetTexture }, + .{ .sampler = self.linearSampler, .texture = self.state.emissiveTarget }, + }, 2); + // postProcPass.bindGPUFragmentSamplers(1, &.{ .sampler = self.blockySampler, .texture = self.state.emissiveTarget }, 1); + + // post processing + hdr etc... + if (self.screenPlane == null) { + self.screenPlane = getMesh("m_screenPlane"); + } + + if (self.screenPlane) |mesh| { + postProcPass.drawGPUIndexedPrimitives(mesh.index.size, 1, mesh.index.start, @intCast(mesh.vertex.start), 0); + } + + postProcPass.endGPURenderPass(); + } + pub fn draw(self: *@This()) void { const cmd = self.state.cmd.?; - if (cmd.waitAndAcquireGPUSwapchainTexture(self.window, @ptrCast(&self.state.swapchainTargetTexture), null, null)) { + var z = tracy.ZoneN(@src(), "Acquiring Next frame"); + + const shouldDraw = cmd.waitAndAcquireGPUSwapchainTexture(self.window, @ptrCast(&self.state.swapchainTargetTexture), null, null); + z.End(); + + if (shouldDraw) { if (self.state.swapchainTargetTexture == null) { _ = cmd.submitGPUCommandBuffer(); return; @@ -688,103 +829,9 @@ pub const Renderer = struct { // preMeshPasses self.drawDirectionalShadowMap(cmd); - // - - // draw skybox - { - self.skyboxSystem.render(cmd); - } - - // can cache this - const targetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ - .texture = self.state.targetTexture, - .load_op = .loadopLoad, - .store_op = .storeopStore, - }); - - const depthTarget = std.mem.zeroInit(gpu.GPUDepthStencilTargetInfo, .{ - .texture = self.depthTexture, - .load_op = .loadopClear, - .store_op = .storeopDontCare, - .stencil_load_op = .loadopDontCare, - .stencil_store_op = .storeopDontCare, - .clear_depth = 1.0, - .clear_stencil = 0, - }); - - self.state.pass = cmd.beginGPURenderPass(&targetInfo, 1, &depthTarget); - const renderpass = self.state.pass.?; - renderpass.setGPUScissor(&self.scissor); - - //renderpass.bindGPUGraphicsPipeline(self.testPipeline); - renderpass.bindGPUFragmentSamplers(1, &.{ .sampler = self.blockySampler, .texture = self.defaultTexture.texture }, 1); - renderpass.bindGPUFragmentSamplers(2, &.{ .sampler = self.blockySampler, .texture = self.defaultTexture.texture }, 1); - - renderpass.bindGPUVertexStorageBuffers(0, &self.ssboScene, 1); - renderpass.bindGPUFragmentStorageBuffers(0, &self.ssboScene, 1); - renderpass.bindGPUVertexBuffers(0, &.{ .buffer = self.meshPool.vertexBuffer, .offset = 0 }, 1); - renderpass.bindGPUIndexBuffer(&.{ .buffer = self.meshPool.indexBuffer, .offset = 0 }, .indexelementsize32bit); - - // render the meshes - renderpass.bindGPUGraphicsPipeline(self.meshPipe); - renderpass.bindGPUFragmentSamplers(self.shadowDepthTextureSlot, &.{ .texture = self.shadowDepthTexture, .sampler = self.blockySampler }, 1); - // todo move into materials system - - try self.uploadUniforms(cmd); - //rendering each mesh - { - // placeholder textures - - const container = rend.MeshComponent.BaseContainer; - const uploadCount: usize = @min(container.dense.items.len, MaxObjectCount); - for (0..uploadCount) |i| { - const component = &container.dense.items[i].value; - - var t = component.texture; - if (t == null) { - t = self.defaultTexture; - } - - if (component.mesh) |mesh| { - renderpass.bindGPUFragmentSamplers(0, &.{ .texture = t.?.texture, .sampler = self.blockySampler }, 1); - - if (component.cmrf) |cmrf| { - cmrf(component.cmrf_ctx); - } - - renderpass.drawGPUIndexedPrimitives(mesh.index.size, 1, mesh.index.start, @intCast(mesh.vertex.start), @intCast(i)); - } else {} - } - } - - for (self.postMesh.items) |interface| { - interface.func(interface.ptr, cmd, renderpass); - } - renderpass.endGPURenderPass(); - - { - const postProcTargetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{ - .texture = self.state.swapchainTargetTexture.?, - .load_op = .loadopDontCare, - .store_op = .storeopStore, - }); - - const postProcPass = cmd.beginGPURenderPass(&postProcTargetInfo, 1, null); - - postProcPass.bindGPUGraphicsPipeline(self.postProcessingPipeline); - postProcPass.bindGPUFragmentSamplers(0, &.{ .sampler = self.blockySampler, .texture = self.state.targetTexture }, 1); - - // post processing + hdr etc... - if (self.screenPlane == null) { - self.screenPlane = getMesh("m_screenPlane"); - } - - if (self.screenPlane) |mesh| { - postProcPass.drawGPUIndexedPrimitives(mesh.index.size, 1, mesh.index.start, @intCast(mesh.vertex.start), 0); - } - - postProcPass.endGPURenderPass(); - } + self.skyboxSystem.render(cmd); + self.drawMeshes(cmd); + self.drawPostProcess(cmd); for (self.postRenders.items) |interface| { interface.func(interface.ptr, cmd); @@ -852,6 +899,7 @@ pub fn reloadShaders() !void { return; }; try gRenderer.createMeshPipeline(); + try gRenderer.createPostProcessingPipeline(); } // ====== renderer API ======= @@ -900,6 +948,7 @@ pub const RendererState = struct { cmd: ?*gpu.GPUCommandBuffer = null, swapchainTargetTexture: ?*gpu.GPUTexture = null, targetTexture: *gpu.GPUTexture = undefined, + emissiveTarget: *gpu.GPUTexture = undefined, }; pub const CustomMeshRenderFunc = *const fn (?*anyopaque) void; @@ -907,3 +956,4 @@ pub const GPUTextureType = gpu.GPUTexture; const plane_obj align(8) = @embedFile("embedded/plane.obj").*; const screenPlane_obj align(8) = @embedFile("embedded/screenPlane.obj").*; +const tracy = core.tracy; diff --git a/extras/gameExtras/src/objectSpawner.zig b/extras/gameExtras/src/objectSpawner.zig index da4f059..638628a 100644 --- a/extras/gameExtras/src/objectSpawner.zig +++ b/extras/gameExtras/src/objectSpawner.zig @@ -8,6 +8,11 @@ spawnRotation: core.Rotation = .{}, pub const SpawnEntry = struct { typeName: []const u8, spawnFunc: core.GameObjectList.SpawnFunc, + opts: Options, +}; + +pub const Options = struct { + absoluteSpawnposition: bool = false, // if set, won't move the object to where the spawn rotation and position is }; pub fn create(allocator: std.mem.Allocator) !*@This() { @@ -29,7 +34,9 @@ pub fn tick(self: *@This(), dt: f64) void { if (ig.smallButton(entry.typeName.ptr)) { if (entry.spawnFunc(self.objectList)) |new| { const entity = new.vtable.getEntity.?(new.ptr); - self.prepareEntity(entity); + if (!entry.opts.absoluteSpawnposition) { + self.prepareEntity(entity); + } } } } @@ -39,7 +46,12 @@ pub fn tick(self: *@This(), dt: f64) void { } pub fn addSpawnFunction(self: *@This(), comptime name: []const u8, comptime T: type) !void { - try self.spawnFuncs.append(self.allocator, .{ .typeName = name, .spawnFunc = core.GameObjectList.spawnObjectFunction(T) }); + var opts: Options = .{}; + if (@hasDecl(T, "SpawnOptions")) { + opts = T.SpawnOptions; + } + + try self.spawnFuncs.append(self.allocator, .{ .typeName = name, .spawnFunc = core.GameObjectList.spawnObjectFunction(T), .opts = opts }); } pub fn prepareEntity(self: *@This(), entity: core.Entity) void { diff --git a/projects/content/_shaders/dxil/debug.frag.dxil b/projects/content/_shaders/dxil/debug.frag.dxil index 75770c40ed6abb8cf37807d05168b7a92601217f..d8cf8b2a2c389664a3df0dacaaacd1c94faa0227 100644 GIT binary patch delta 850 zcmbOuwng01CBn(s*E-z9#%or&VK2jp2bpQ*j0_A6Teuk**nzYS5c>de2M|92;vS%6 z3L67M!$iwq!4RMT6A*I%F$j1}oGUE~W&jD0DGor)3}R1QE6ut9$S|3BQF!75UKS<> zMy81$wK+k$L4a|xBBQz|m<8f7x(I-@2?DVa5W4^|2n2^XhFoA_U`PP6O@QXRM0omu z>=6L+cL2qmoDbYnw zxYF6&zP!F;F}H4tOH20d+_HJS0pny5HUUd}U1PT1!x2@?yx$ILFioig1+oq+ zB+$Ll0$l_s4hwWAV4%k^PTt8L!h;mj9>9<`o$SX^B6+wi^}+&Po<)t)O8LznS`W4< z3Nt4-U$jV`e1;>A>7c}Bea=G0dR<^t3bQ!sfT9$b%osvc9ZZ-5xLO^I-58n_I_i^I z6gZkRBp8(0I2oD}5+V+p7#{6#WNJ{5kPvqaY&T4rz@Wgv#ugS5T71Ld#PK#KJ2Qz- zl7=1(0xZla!JB-f+<1f-SPnAWoT8K5BG}Br;Ar4rrh0l&!Vv{V2LT@23BD(dIN<8H YAk>TKBGkLW)lcxfXvE&2akn1rf`iSekvGzVK1=1x5x21{rP!26iBA1H?W++yTT#fH(pu zDZ$3TU^3A%cw&IW#3dpVZwRpV0A)-jeiWX>$jidWz{ogRkWrfzWDLV(S4MS95Q_z(i!U#1E z*3F6vY8XN=srK^Ro|&Jft8N2@;sa=?TA+pM38YZf2Zrhf zMxG7_1z>Q4gU}Tigr<{cag=b~Z&PGuPH?_xkvLhMGmgnoV)F-<0>=78pi)_&Vqq3X z9Z)2(0&$3{LkL%^0kea#8$**qM?Fx8L79z{p(!CDq*+DxP=_N^gMx&Fn4#}6gQN)z z3LI?5LIXscdn8mCIGPxXWJ90wK$JJcxQ8l2l`C8i4E2R7KT#SY>Z|}VmXQGftYOHD diff --git a/projects/content/_shaders/dxil/lit_mesh.frag.dxil b/projects/content/_shaders/dxil/lit_mesh.frag.dxil index 1a192f488f516b5185e826a7dab01738a817eb41..1918753411cf19137506bea3a52fa35715dc80cb 100644 GIT binary patch delta 3327 zcmai1dsGuw8lRa=Cc`9wiM#?qGdu+eI9LqQTABom)S`>kwP3ZKgo0KnqEhQ4ZC*qJ z4J9@%#YflRgQ7)GC~9%nM-osdDx!8PXOALc7SkS!6m^T%Wp@UWZTnYqa&zzfe&7A> zH^1*OCy!sUznqycfzx{{ zEmvea`=faP(9n8>6$%j*yNU}N+hsp2ydJXH?P&!bNpd^d>H{H7iB$q!OrlYdXqu9UtJmoIq38-k z_iY5Qd==32IY@laoTM1PD+UIp4d0!n+t#*Y8$d7U@3_7zg7ysnwg>?rj`lQ?m1k8# z!5yFQ);;)fAusMCyK`P6qP%FcbCN;5?J{R7*lYWNQwsLm-arWmjIwP(*G953h^7Ck zEBSZAP3h0YpDo+Oc_Ph_6GsD}R@*pwQoHZyt?QTjJ^vg!*LS_A*K6+|?)D_09j8F~ z_yAiD&dDz^5L2;0P7;oCwKPwaZS(lk#wwVmVYq zJ{T&6k2qAqMe@)Dv<&Bnpk>6hu(}~-Yfkc_w`ytCyO+%xlVEWHm;53Y>iOVOJS)w^#+N2%r7 zsEaD$j)br-RrX@;X$N;8KQOPc`COCR)6?xuKuwXQ1?G)9c7@ecAl#}qo8Ino@a_X# zFU4&kAG>kxd51ig^L`&$-~J*HT$w=``OvjMQT38?_9lw;0TGiBJ|x|~jA49kWJ&2d zRmH|&c(7>akaT_qEpzG?v{TTK z-2TgkZML<030&8_?ltkQ7C$)FQ*%78tZYGV z5YT#u8v$ijhx}yh@dlJtoEhBopUz)SGKCUFR|!R@A_x9`;lQ-qUpV8fX@Q|o+#eNA zJzaaYes-R()AN=a|pO#y6uc0Ce|Y!2Pe`Wr0bxKGf@-6cg5y?Oy`&=gq^KV z1Ydw!RYZ=QuLJ|Xqnt(+|1o8hVTT2P`$eq zn>bo0=Uq~*wE_f++)i4(xtG&mM|^mLyN+{!!q$@N33%m<@~!1qqtg!`QGCt$g2dkQ z!MA5@-il)l1Ae&0{WYhN!q)juC+k3QvwMcqWtKxaLRfJeM?Q35U*a74HZ9}MS%dI7 znCvh_S%h%_Y5)z~BUbDfj;VbXwx>3^liCc47M}&--yK-f2=4YA?u5UW~yTVl;ONX zTS?OkxUqVDzk z?qT^3kzpHPEJO~XN*)h@UCz-poI=vKezxQPODJHuUy4;NCoN;Fr$P`LO^XTf6jdg6 zt?F%fK^~*(KPifKM?iI9;Xb3T!t0a+JIvO&EEu|j+v@(#nS+lE=QHYhzrRw z*YY*ESTsgtNqM6!Dq0=XSO`y%f+n5C9CCaFi6JiZls6weOK5KJ&pNqUIh)0wAMzui zNzfTJjUt0w_=#*#KGrC5%hBzzhV}Tl?~x5SwAWN!m?v5-C?LZ| zBPIgLx+MKB#z7@`id=|z8*3@egFzz+d|jRuhL7%!FF%X4|fTD#hAf)~@f!d%{k zf|z)3k)&bDuLiiP`vkJBC8d?EV}^AxOAVl6pw4Q=!;%h96qu; zel>mA_{|kWd3f7LAT-i_YcKWmdk&8S@Nqm1jF5>25GW%I{Wc=;lC)ncg7R zU&(%}t8+*`(^K@w5l%miwUqZ9%90{lP%L8g>S($qq7?n9XuV4OYm`WJIn&(Vta_|m zIo8QElLRg5TJ0u$F~1OVHVt*H=$f~}7xPmw9>K2dE8C*Q*)>E~7@gI+owWfLO)2Fm zx&esyB4d5&&Q7F`j;ADAEGkgY99@@P&~dB+{!-p%AmW;DGoN=Vnoju2_uzH`T!!AM z$kvNo_1x@Mw&$V^6@CJ2urVn)tu+KduIZmjD0& delta 3191 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 delta 1696 zcmdT^i%(Nm7(cgMZ(FGC<*`vH>OsH(D%Q%%!)osBMReLuCa5?uX`y7DRyXXjIk$wq zgsPQ@w}t}Fb-qG$b9LaL%q1;Ftq4*a%Zf4w5uIaX!}tivvSf$p65Znu*iC-<&iQ`d z`EKq#zu$KxWh^Pbpj64s>juV)TOQRK;Gv%eYI#Bo0H6~Bz(rAkphB=CbR#$r8AQYw zw?4mah7V=3>jz@%M^Z5kI|G};Dljo?z^FVCVy5xeQ(QuqWD@{rP~rgUQBeAd3ZO`$ zeGB@rr_8hO(MwN6D0%~nLd zljk<|rV_V(!cnQ{!3fb-B%Go|kD%xdy~sK?8DA1@HUaU|uZB@L05jPteD>@; z)XCIBu+L3JnkNKcGy(KfM04(=zxzHaHnQjNh1K?Q3niA=%wb64GdjF{PL)9{w7Fnu zO!R4)qBGwsbMZN56=~O5sccD%a+A1R!+V37RFR&&!IDx*(&ombUczQitr7DyjC4DM zz&(%0@nB&o`Q7*sl$e2$;| zWPaecogc8(+itpjev-Qta(k0P^en;paCqWI+4W%0@V!$w{enyp|CP+^ZOduTzy@rB z{)<_TzO$+wtBVGc1I9)sDrG*qZFkE2isl$t8JsK|>$!VteC$%s-BWl;8amsl==cKW zwC8k6J5dX72ECzny2ob|S$hrpvK(g(nX5hDqD~pcH z7AB!(b8-B%^mjeA!qLB3LGz3i4*!p>;Qv<}#IuH|nAm^nzvManyC8X)&`Q&NeQJ`Y z3z$;7asMISwC*ibx&-eUI!H!+Lo$p)!qHnyY6+<&MNda^4T^+T^waKVR^tFhR1j1X|UuR5$gHF)8~~?Dd`|*m0Z1YEz@h=$ z3!RlccA8^?VrrPy-;k9b1dvA%;-s7Mv?nzh8`f3jC@&;Gj<#|EE!B6y412Ov&|jf) q4A_8JO&YqX=lX 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 QAq)uXeefVf!vlu$AM|fWJpcdz delta 2235 zcmeH|e^4987036)ah#AqCy?utCDcRw2y!SRWFcaT-8)HOh($*>u1yk{NEmFK2x6cl zwNnR42vwojl`K49s2NniO!ZEe$6>ai)DyHIiw(_UdQp2moL#9)K9w z=R?y$b3h9~Ylp!g46MYs^7gv)q-#Ln3KP*j7*e|ans^$CLlJ-=Za$J2&4NzS%^qgM+6QahC35_9-y{3~+oBrfJKHbpZARyca{iTH{+x<^o`IBdm;UK>n=wpxQb~w&=Zw$NtWK6QAN)4wd18QNR4|0(p>7W0$vE`^ZxQwRFm2 zHlmeXZ*zYo?bt-m|DV5)9vKQXVuzuRENgm%bAq>Y}5z*3>u*Dts+gna?A|3*?F?o> zHdi6(5(xP^XFEH6*CeWurpZ})Zh<~FZ4b7pm$dFtwbFyBg`lmE8#_SUyAJfd2(@E> zHZl7R0LMrG-gJM>`9U*&&`OI%HcOZy(C9HQn`JSP@wP6iob37C`}sq;`4<%VALV(6 z*({fiz^kovrU>=lb`l{!q0!`vST$B>wdwq=2Z6lX1ZG)pgfe*28Rm!m_Az?gYA-Itz5ft z{Yp4kGd+0j#LQd?;c(y;!o|+{p7MFDI{sc?{Q6RS2=E@zJo{FY>Gj&IBUROPKP|QP z#R_|WS#fru{7%n&hq*>=|5N4W$wLRybJH^JJD0uFo>teHshrEMGeae8r=sd-Sq;^V zuQfFstZpo|UPuu3aw;U{>KB|n^P&o}0%|OD(7)F}k6{2Y8cyMj$YOqkG;e}MvY(3U{7e27g74GX=xv#{Xx+r> z4}bN?=X{ikm-Fyytq4(;U-{=!u$*cuM04 z<6HIf7%c}kBDDvKn9?G_qY$MWd~Q zUcP6mf6MXXr={JL;8WD&P@w_T<4nh|DjBMq&001QewwSwYz|B|E#{h$xs&5|Gq+3k z!ihbtQ|Hb=x}M;D_cmo?wwTKBZA;gEf5wzlUQU>}IBxfF!yv4$dQntHZ&Il~R&^?e z6}cbD7=0^u_UgO3x~#8fYM-Z-$rFu3oP#6Jx_c7Hrr<{T+Nb_tXr+5G7z&?9i-ihB z{$}s6_rpBz(6Cp={NxvKa@HT#v)(qfWwpO+dj9B5C?IR>cVBBczPqu%rzc?)8QB`M z^MA*YkpiF?e%VBn$&4I(kz-e|3%t_-Ttah$?2J0Y>+jEwYL*vnOxCTx1wabM237-g z%oeB*IT)6iB8y(;H+`w7bOH*;Frm12m+Wzlp#ynvV){wIE=)B5Y}2;NjYt|#NJVGk z<8#WH>}~?|v(@r$Io{6>$SVzzaN8Dbz+pk4cE+m|KLx`;v(?adX|GRQq5DXrb|#OvU>A^MHIA%`;hF%s}3fO nS;WEd+;%b*$|DUibyQ5lQOy7N{irvVFiry%bBKU@1=~LXG-3x* diff --git a/projects/content/_shaders/msl/debug.frag.msl b/projects/content/_shaders/msl/debug.frag.msl index ecf7cb2..929e58a 100644 --- a/projects/content/_shaders/msl/debug.frag.msl +++ b/projects/content/_shaders/msl/debug.frag.msl @@ -6,6 +6,7 @@ using namespace metal; struct main0_out { float4 out_var_SV_Target0 [[color(0)]]; + float4 out_var_SV_Target1 [[color(1)]]; }; struct main0_in @@ -16,7 +17,9 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]]) { main0_out out = {}; - out.out_var_SV_Target0 = float4(in.in_var_TEXCOORD0, 1.0); + float4 _20 = float4(in.in_var_TEXCOORD0 * 4.0, 1.0); + out.out_var_SV_Target0 = _20; + out.out_var_SV_Target1 = _20; return out; } diff --git a/projects/content/_shaders/msl/lit_mesh.frag.msl b/projects/content/_shaders/msl/lit_mesh.frag.msl index 53707a1..59e33df 100644 --- a/projects/content/_shaders/msl/lit_mesh.frag.msl +++ b/projects/content/_shaders/msl/lit_mesh.frag.msl @@ -10,6 +10,7 @@ struct type_Uniforms float4 directionalLight; float4 directionalLightColor; float2 screenSize; + float lightPower; float time; }; @@ -27,12 +28,13 @@ struct type_StructuredBuffer_Scene Scene _m0[1]; }; -constant float4 _86 = {}; -constant float3 _88 = {}; +constant float4 _88 = {}; +constant float3 _90 = {}; struct main0_out { float4 out_var_SV_Target0 [[color(0)]]; + float4 out_var_SV_Target1 [[color(1)]]; }; struct main0_in @@ -47,110 +49,145 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], const device type_StructuredBuffer_Scene& scene [[buffer(1)]], texture2d Texture0 [[texture(0)]], texture2d Texture1 [[texture(1)]], texture2d Texture2 [[texture(2)]], texture2d DirectionalShadowDepthMap [[texture(3)]], sampler Sampler0 [[sampler(0)]], sampler Sampler1 [[sampler(1)]], sampler Sampler2 [[sampler(2)]], sampler DirectionalShadowSampler [[sampler(3)]]) { main0_out out = {}; - int _97 = int(scene._m0[in.in_var_TEXCOORD4].textureMode); - int _98 = _97 & 240; - float4 _132; - if (_98 == 16) + int _99 = int(scene._m0[in.in_var_TEXCOORD4].textureMode); + int _100 = _99 & 240; + float4 _134; + if (_100 == 16) { - float3 _119 = float3(Texture0.sample(Sampler0, in.in_var_TEXCOORD0).x, Texture1.sample(Sampler1, in.in_var_TEXCOORD0).x, Texture2.sample(Sampler2, in.in_var_TEXCOORD0).x) + float3(-0.0625, -0.5, -0.5); - _132 = float4(dot(_119, float3(1.164000034332275390625, 0.0, 1.7929999828338623046875)), dot(_119, float3(1.164000034332275390625, -0.212999999523162841796875, -0.53299999237060546875)), dot(_119, float3(1.164000034332275390625, 2.111999988555908203125, 0.0)), 1.0); + float3 _121 = float3(Texture0.sample(Sampler0, in.in_var_TEXCOORD0).x, Texture1.sample(Sampler1, in.in_var_TEXCOORD0).x, Texture2.sample(Sampler2, in.in_var_TEXCOORD0).x) + float3(-0.0625, -0.5, -0.5); + _134 = float4(dot(_121, float3(1.164000034332275390625, 0.0, 1.7929999828338623046875)), dot(_121, float3(1.164000034332275390625, -0.212999999523162841796875, -0.53299999237060546875)), dot(_121, float3(1.164000034332275390625, 2.111999988555908203125, 0.0)), 1.0); } else { - float4 _131; - if (_98 == 0) + float4 _133; + if (_100 == 0) { - _131 = Texture0.sample(Sampler0, in.in_var_TEXCOORD0); + _133 = Texture0.sample(Sampler0, in.in_var_TEXCOORD0); } else { - _131 = _86; + _133 = _88; } - _132 = _131; + _134 = _133; } - float4 _138; - if ((_97 & 1) == 1) + float4 _140; + if ((_99 & 1) == 1) { - _138 = powr(_132, float4(2.2000000476837158203125)); + _140 = powr(_134, float4(2.2000000476837158203125)); } else { - _138 = _132; + _140 = _134; } - if (_138.w < 0.00999999977648258209228515625) + if (_140.w < 0.00999999977648258209228515625) { discard_fragment(); } - float3 _192; + float3 _150 = float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * Uniforms.lightPower; + float3 _197; do { - float3 _149 = Uniforms.lightPosition.xyz - in.in_var_TEXCOORD1; - float _150 = length(_149); - float _151 = _150 * _150; - float _157; - if (_150 > 2.0) - { - _157 = 0.5 / _151; - } - else - { - _157 = 1.0 / _151; - } + float3 _154 = Uniforms.lightPosition.xyz - in.in_var_TEXCOORD1; + float _155 = length(_154); + float _156 = _155 * _155; float _162; - if (_150 > 4.0) + if (_155 > 2.0) { - _162 = _157 * 0.5; + _162 = 0.5 / _156; } else { - _162 = _157; + _162 = 1.0 / _156; } - float _164 = (_150 > 15.0) ? 0.0 : _162; - float _166 = (_164 > 1.0) ? 1.0 : _164; + float _167; + if (_155 > 4.0) + { + _167 = _162 * 0.5; + } + else + { + _167 = _162; + } + float _169 = (_155 > 15.0) ? 0.0 : _167; + float _171 = (_169 > 1.0) ? 1.0 : _169; if (length(in.in_var_TEXCOORD2) < 0.100000001490116119384765625) { - _192 = (in.in_var_TEXCOORD1 * float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5)) * _166; + _197 = (in.in_var_TEXCOORD1 * _150) * _171; break; } - float3 _173 = fast::normalize(_149); - _192 = ((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * precise::max(dot(_173, in.in_var_TEXCOORD2), 0.0)) * _166) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * powr(precise::max(dot(in.in_var_TEXCOORD2, fast::normalize(_173 + fast::normalize(in.in_var_TEXCOORD1 - Uniforms.viewPos.xyz))), 0.0), 30.0)) * 2.0) * _166); + float3 _178 = fast::normalize(_154); + _197 = ((_150 * precise::max(dot(_178, in.in_var_TEXCOORD2), 0.0)) * _171) + (((_150 * powr(precise::max(dot(in.in_var_TEXCOORD2, fast::normalize(_178 + fast::normalize(in.in_var_TEXCOORD1 - Uniforms.viewPos.xyz))), 0.0), 30.0)) * 2.0) * _171); break; } while(false); - float3 _209 = ((in.in_var_TEXCOORD3.xyz / float3(in.in_var_TEXCOORD3.w)) * 0.5) + float3(0.5); - float3 _211; - _211.x = _209.x; - float2 _212 = _211.xy; - _212.y = -_209.y; - float _219; - int _222; - int _224; - _219 = 0.0; - _222 = 0; - _224 = -4; - float _220; - int _223; - for (; _224 <= 4; _219 = _220, _222 = _223, _224++) + float3 _214 = ((in.in_var_TEXCOORD3.xyz / float3(in.in_var_TEXCOORD3.w)) * 0.5) + float3(0.5); + float3 _216; + _216.x = _214.x; + float2 _217 = _216.xy; + _217.y = -_214.y; + float _224; + int _227; + int _229; + _224 = 0.0; + _227 = 0; + _229 = -4; + float _225; + int _228; + for (; _229 <= 4; _224 = _225, _227 = _228, _229++) { - _223 = _222; - _220 = _219; - for (int _233 = -4; _233 <= 4; ) + _228 = _227; + _225 = _224; + for (int _238 = -4; _238 <= 4; ) { - _223++; - _220 += float((in.in_var_TEXCOORD3.z - 0.004999999888241291046142578125) > DirectionalShadowDepthMap.sample(DirectionalShadowSampler, (_212 + float2(float(_233) * 0.000244140625, float(_224) * 0.000244140625))).x); - _233++; + _228++; + _225 += float((in.in_var_TEXCOORD3.z - 0.004999999888241291046142578125) > DirectionalShadowDepthMap.sample(DirectionalShadowSampler, (_217 + float2(float(_238) * 0.000244140625, float(_229) * 0.000244140625))).x); + _238++; continue; } } - float3 _262; - if ((_97 & 2) > 0) + float3 _267; + if ((_99 & 2) > 0) { - _262 = _138.xyz * 4.0; + _267 = _140.xyz * 2.0; } else { - _262 = _138.xyz * ((float3(0.100000001490116119384765625) + _192) + ((Uniforms.directionalLightColor.xyz * precise::max(dot(Uniforms.directionalLight.xyz, in.in_var_TEXCOORD2), 0.0)) * (1.0 - (_219 / float(_222))))); + _267 = _140.xyz * ((float3(0.100000001490116119384765625) + _197) + ((Uniforms.directionalLightColor.xyz * precise::max(dot(Uniforms.directionalLight.xyz, in.in_var_TEXCOORD2), 0.0)) * (1.0 - (_224 / float(_227))))); } - out.out_var_SV_Target0 = float4(powr(_262, float3(0.4545454680919647216796875)), _138.w); + float4 _276; + if (_267.x > 1.0) + { + float4 _275 = float4(0.0, 0.0, 0.0, 1.0); + _275.x = _267.x; + _276 = _275; + } + else + { + _276 = float4(0.0, 0.0, 0.0, 1.0); + } + float4 _281; + if (_267.y > 1.0) + { + float4 _280 = _276; + _280.y = _267.y; + _281 = _280; + } + else + { + _281 = _276; + } + float4 _286; + if (_267.z > 1.0) + { + float4 _285 = _281; + _285.z = _267.z; + _286 = _285; + } + else + { + _286 = _281; + } + out.out_var_SV_Target0 = float4(_267, _140.w); + out.out_var_SV_Target1 = _286; return out; } diff --git a/projects/content/_shaders/msl/postProc.frag.msl b/projects/content/_shaders/msl/postProc.frag.msl index 6d2534e..e2a7c04 100644 --- a/projects/content/_shaders/msl/postProc.frag.msl +++ b/projects/content/_shaders/msl/postProc.frag.msl @@ -13,12 +13,31 @@ struct main0_in float2 in_var_TEXCOORD0 [[user(locn0)]]; }; -fragment main0_out main0(main0_in in [[stage_in]], texture2d Texture0 [[texture(0)]], sampler Sampler0 [[sampler(0)]]) +fragment main0_out main0(main0_in in [[stage_in]], texture2d ColorTexture [[texture(0)]], texture2d EmissiveTexture [[texture(1)]], sampler Sampler0 [[sampler(0)]], sampler Sampler1 [[sampler(1)]]) { main0_out out = {}; - float2 _19 = in.in_var_TEXCOORD0; - _19.y = -_19.y; - out.out_var_SV_Target0 = Texture0.sample(Sampler0, _19); + float2 _43 = in.in_var_TEXCOORD0; + _43.y = (_43.y * (-1.0)) + 1.0; + float4 _51 = ColorTexture.sample(Sampler0, _43); + float3 _52 = _51.xyz; + float3 _66; + int _69; + _66 = EmissiveTexture.sample(Sampler1, _43).xyz * 0.2270270287990570068359375; + _69 = 0; + float3 _67; + for (; _69 < 5; _66 = _67, _69++) + { + _67 = _66; + for (int _77 = 0; _77 < 5; ) + { + float2 _85 = float2(float(_69) - 2.5, float(_77)) * float2(0.001953125); + _67 = (_67 + (EmissiveTexture.sample(Sampler1, (_43 + _85)).xyz * float3(0.039999999105930328369140625))) + (EmissiveTexture.sample(Sampler1, (_43 - _85)).xyz * float3(0.039999999105930328369140625)); + _77++; + continue; + } + } + float3 _99 = (powr((_52 * (float3(1.0) + (_52 * float3(0.00999999977648258209228515625)))) / (float3(1.0) + _52), float3(0.4545454680919647216796875)) + (_66 * 0.0500000007450580596923828125)) * 1.0; + out.out_var_SV_Target0 = float4((_99.x * (1.0 + (9.9999999747524270787835121154785e-07 * EmissiveTexture.sample(Sampler1, _43).x))) * (1.0 + (9.9999999747524270787835121154785e-07 * ColorTexture.sample(Sampler0, _43).x)), _99.yz, 1.0); return out; } diff --git a/projects/content/_shaders/msl/skybox.frag.msl b/projects/content/_shaders/msl/skybox.frag.msl index 2c457a3..1abee72 100644 --- a/projects/content/_shaders/msl/skybox.frag.msl +++ b/projects/content/_shaders/msl/skybox.frag.msl @@ -3,9 +3,17 @@ using namespace metal; +struct type_Uniforms +{ + float brightnessFactor; +}; + +constant float4 _28 = {}; + struct main0_out { float4 out_var_SV_Target0 [[color(0)]]; + float4 out_var_SV_Target1 [[color(1)]]; }; struct main0_in @@ -13,10 +21,12 @@ struct main0_in float3 in_var_TEXCOORD0 [[user(locn0)]]; }; -fragment main0_out main0(main0_in in [[stage_in]], texturecube SkyboxTexture [[texture(0)]], sampler SkyboxSampler [[sampler(0)]]) +fragment main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], texturecube SkyboxTexture [[texture(0)]], sampler SkyboxSampler [[sampler(0)]]) { main0_out out = {}; - out.out_var_SV_Target0 = powr(SkyboxTexture.sample(SkyboxSampler, in.in_var_TEXCOORD0), float4(0.4545454680919647216796875)); + float4 _38 = SkyboxTexture.sample(SkyboxSampler, in.in_var_TEXCOORD0) * Uniforms.brightnessFactor; + out.out_var_SV_Target0 = _38; + out.out_var_SV_Target1 = select(_28, _38, bool4(length(_38) > 1.0)); return out; } diff --git a/projects/content/_shaders/spv/debug.frag.spv b/projects/content/_shaders/spv/debug.frag.spv index 4de2ab7f5619d8539945a454e0ce1c96846e4909..103f69a42fc67a069402adca8cb4619abef8cdc4 100644 GIT binary patch literal 604 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 diff --git a/projects/content/_shaders/spv/postProc.frag.spv b/projects/content/_shaders/spv/postProc.frag.spv index d030ccbb8428a647a717c295fff86fd8ca0748b1..9f5a7d13f4d7c25ce2219992202b8537efde9c7a 100644 GIT binary patch literal 2780 zcmZ9N?^Bdj6vrRIl~e*u(A3H$?1xD!ny85&g+wI@0wHRpTWq++vb4K8`Oc=P=~e%W zZ<}d)*QY2SWU+y{I@45G$bMJYU?yixZB-xQ9Nng_9uVY`* zl`?yiUFkeGzdT=Rw$@8$#>dqAl5VF|>rZ-;o!DKVR<3TztI7>v$#Vc!cT!+pgD9}C zcI&}*rF43|RIQaaD){odm}lyn^~Or&%htVybjrI&8s99}wl^z{HeX1dz*ufmX>RVZ z8*a8%Z8od-E3r+1UH1GRd#b&@C(X6GRk~kplvZZfW)>EfE@%6+>#E;trQ-7H?Uiz4 zqtZexP+h*>0u}CM!(4v<6*Wh!_wk$uGW5Nhyl>6V1NT(d9|jJ6Ys~BVdEI*Ry1u%v z>U!(W>-wP|AiG}tA~->;_LCq<9{x0h--lHM?xn8ZpYx3$0K{K9h`tX?&YEMtr?5}{ z@Y~cVm8tIsa)F2&g!}cE`N{By@P9n_?RcDf0N)Y&9K`nQK&*Qj?&k-0r()e9eETi* z!`M_cZN5ja%-6d=MCTZ%Z@qFc^c_XkJkvJQ*uzBGoAS?QeE7bx>pa7=jxxKq?{9pO z*?W@T&pyMN@%Ham8CSxVw?~$^HTOCRb;sZM>hAz~&(t=DcQfBPa`0U9Fy;!F2a&^j*yf;i6{tlH3)t$B!(yg0r8%e@ zFK-Uob#m)vz6Q+yYwFQo$~fOFVwSPpe~}pbcLf+HZ=cA$59Iy+>=U_F;9IH1yI#lc zeAhKNdE*_?!#A+igd^THdh;fnF~>pl<}GaRQO%mn;{(u{$A@s8d3*#XZ@eS&xQ(qQ z9G!XGfiotbhwo=DcfdpPu#bE<@39}`d%$@1E>TbGJ`!SAL#xGKD-NGTVhIzoEti`C-hhPGY4(^70iB)<;*$|%bRL) ZH1JPSu!FiBo|@Q=-p}mtzp8#I{{w5LH6#E4 diff --git a/projects/content/_shaders/spv/skybox.frag.spv b/projects/content/_shaders/spv/skybox.frag.spv index cc5714877ca184ed1b670656bcb1382962611182..f33fd3ddeafdc31a9826f390aa559f51c20c5f5d 100644 GIT binary patch literal 1308 zcmZXS+fEZv6oxlF00NdX2q?A`5G9#tqQu0g@mMcNFti|dW(s4OXj?KfHE_oh_#VCj zPsR<2|F>th8RJe?*Ixhs?{%6M3-u9WhKw;4v#npwv?*9*+zeaa*lq55adP54efAi> zVv0D+O`1_t(!C(-`e6?o7OX6rQUs?Wx)m*UB%rL^!@`n_v%otZv;!~f`klbyXq(?J z+WqrZaGngJKr#AJr;q*a*^eMnXz^R}slNG_KtJa62fgrHKkCMc$pX%4M`7nQ=>>88 z(LYZ5S-!Fv7nggY8Y6b5u;=~sBd_)0=-uAl{(HL%IA-k+5=%A@zqb6S6C`5c*uj6? z6S&epJ3~7mt=&gD-$}L-(~y>(uF5#X)Xc}!A?8cMv%@tRyLWL-cMdT-%k#u}o*lqb z7d^4#KdF1S!@6)zLrO5}%}ak7DPxA*N^c&mpEy_RU*j`l2qq5z_}f zfw`FPpK6M>zq^W=;hsEo(eLQH(Wl!feP1i$fAdlb=Dsf@4{OAIiY<_B-qAQO1*l{k+no?1h*+J4AD%YR_eV0Kx2GR{#J2 literal 868 zcmYk3-%0{e5XMiMT4`EYni`>XS!`WY1d%rt-Uvd9c^7LgB4x?ChQ3-))FX5g^!<(+ zdti3v`@_tfv(dPn#&oY8jI-tEwZ4 zp*whoM}^x`1+M|Bq9&%?5fM{g>R>kVoR>-0a|T1V?^!-BzWF-qeoR~5G?@6FFn)Si z|JWUl-aKE>@@vX-fAe36$;}Rfcjwdfoz_F=uF-hBx4WaU+s7oZVzd3+a{ay+NR3Ge z-vjTuyrH?h#j2(zFEb7m958*un7bS)=!p)lC^%qt59{Eio>TV?;j-dHUh1Uc?CZOl z7fz{$W9F&$1aB(vgrlGv@YZ?@15AJJ40ok2^k3eI89zdM z%C~Z{Q%->w%*?!kd0_6euV7wVDti?ac;KJp