From 20caf5ea4debf5de5405d0a66dca8fdf33197cd7 Mon Sep 17 00:00:00 2001 From: matthew Date: Mon, 27 Oct 2025 07:02:07 +1100 Subject: [PATCH] begin rework of engine for 3d rendering --- assets/shaders/gradient.comp.spv | Bin 2140 -> 4496 bytes assets/shaders/pbr.frag.spv | Bin 7956 -> 7472 bytes assets/shaders/pbr.vert.spv | Bin 4628 -> 4824 bytes dub.json | 2 +- src/VulkanRenderer | 2 +- src/dlib | 2 +- src/game2.d | 60 ++++++++++++++++++++++++ src/gears/game.d | 4 +- src/gears/main.d | 7 --- src/shaders/gui.frag.glsl | 19 -------- src/shaders/gui.layout | 9 ---- src/shaders/gui.vert.glsl | 57 ---------------------- src/shaders/pbr.frag.glsl | 78 +++++++++++++++++++++++++++++++ src/shaders/pbr.vert.glsl | 54 +++++++++++++++++++++ src/shaders/structures.layout | 75 ++++++++++++++++++++++++++++- 15 files changed, 271 insertions(+), 98 deletions(-) create mode 100644 src/game2.d delete mode 100644 src/shaders/gui.frag.glsl delete mode 100644 src/shaders/gui.layout delete mode 100644 src/shaders/gui.vert.glsl create mode 100644 src/shaders/pbr.frag.glsl create mode 100644 src/shaders/pbr.vert.glsl diff --git a/assets/shaders/gradient.comp.spv b/assets/shaders/gradient.comp.spv index 7ca20858e3be52260cf6a680a04866b83e951a4f..4763e9cd60001c0838aa96820ae8ee7c39f9e1d1 100644 GIT binary patch literal 4496 zcmZ9O*>W326ow~}C7Xoodk98O*khbM1hU{2*`UNGcGy9TrLjF>EE#F!Bor51a>*m) zo*Q@%UWa0-qKg0P=@U0<*YP>$@3T*L+oj#-hNJSXXm7MHdJ+}uP_#SRB@uqX^Glvz z7T+6H+HgYU!YE}^cIT+T`;QIdT&*OJ z^FD#R-9z!aah`P3I0K_sFqW_L8Ah+IbZxEQON3RN9ewt;l4d`PUG9p`2L7(kY&B_h z8XIx1q2ohZ;urh$YI6t;DmrcW)33$-e}tVF6=Gyt8}WdF)iz9wjkK*R(4%4NZN&V< znH6`6F#%7#%Q$O1wcUQfsyepB8QMA9v!MDYZx#oHZOlPL~Sh^69bh(R?C=Mxip;L$v5Ns_v$+~zHk%s(#$6@etpMX2flUS&cN1(@L_ge3`lCkE z!~VFZ)XG^vX4zRVJv2=-|i@#qo_QXFfuOs4B(J8&*)Qyg9xUjW)j`db54zY;}!GCO31%{w;Cr!LeuWf`~P)9dOPxSV-10?;^2@rDxg6 z#q5TnIqAeE<|WO5nt3-(UJm4yK<2GHtsXxXC+;WWEOhds^M0~UO8-opI_ZgT^|?4X z`Bvy(c%9jf>Pz!};$wdJ;)5Oez7oe4JMy9PhJo?@8shZGISd#3%$gYA_zi4{fgXE| z7^{+rvCCt|h%qK2M$?1X5(B;EF=8Z=>2olK>Gu8Cyx$qcSeJ|+7&$h?S>WVA=bdDY z>U2L8XFf*M91{5<%k`~fzB9Qpas0u^wJA=2;N(K*4Fen1*W&%*n^>$Z$($)-eJ9R7 z7_qwI_<<7(z2`B$aV|NmGnDb~Yv29vE{;F?w#O_#|IG64jO(S~p7YLtLFYu*bpoh? zbH^%){u08uASQ1LIk*F+9}aZx-h|h0%bpwuMEgXG^5P94KN!T~+x{S1VjdE)e@B_g zgH9aYj1wZ>iw$pk(qq_C1NxLI<-Ir~!k>2pf8NCxMc`&LDjC1f<|XOizbOviyeh&E z{7>aME6(~yF{|QZA~0rzY_VUKOnzo+`CpL?ZZ@w|GH%S!2ebb%LV^K z6QjmAL{$;r2z%lYQ^SF5g4^1GdI4~MG-Y!7QZ68B(j-s#;$t&7eAA09>az_ zZ;P|Y!`^if7#9|{9EpSol)tL?62;(%Li_asvr--p`JvEw_~ p9N~5!7bSBa(TByCMAVKxF8+~-cuncpvJXZ)JBRRp^#a@w{RaVddHw(Z delta 187 zcmbQBd`Cc%nMs+Qft8Vgn}L@hoB;v^8JHLtCu$lpa!!nvWenLkm6K6~jUfam8Jw6~ zkds>Emzr3VT3j;u6pNc8NLUew8G+cHfd#Bg3CIQk5I=15T#m(zo>D+FgMdN`K%ro; pBmoBkZ-NwKW1{Dk4%*)%%0s!Zo7g+!R diff --git a/assets/shaders/pbr.frag.spv b/assets/shaders/pbr.frag.spv index 33e0b49ebf8454b59985863d664a419b245f3204..22086e95dbaa8df0140d230cbe266a18b81c3ead 100644 GIT binary patch literal 7472 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 literal 7956 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 PuXJMIkLp{*<~x4_O#xV% diff --git a/assets/shaders/pbr.vert.spv b/assets/shaders/pbr.vert.spv index 6b77a51b06986f38e1055c46e5c5699efcf24315..d66f785c6910b1e7b0ee97cca803f36ad6b37ce1 100644 GIT binary patch literal 4824 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 diff --git a/dub.json b/dub.json index 9dcb5f0..ad9be9c 100644 --- a/dub.json +++ b/dub.json @@ -15,7 +15,7 @@ "libs-windows": [], "preGenerateCommands-linux": ["./build.sh"], "preGenerateCommands-windows": [], - "dflags": ["-Xcc=-mno-sse", "-P-I/usr/include/freetype2", "-vgc"], + "dflags": ["-Xcc=-mno-sse", "-P-I/usr/include/freetype2", "-vgc", "-Jbuild", "-Jassets/fonts"], "dflags-dmd": ["-P=-DSTBI_NO_SIMD"] }, { diff --git a/src/VulkanRenderer b/src/VulkanRenderer index 1290c5f..6021713 160000 --- a/src/VulkanRenderer +++ b/src/VulkanRenderer @@ -1 +1 @@ -Subproject commit 1290c5f45ac49cc5534817e8d6b0adae4ac058af +Subproject commit 6021713286482893ca0614c894419290c6f425d4 diff --git a/src/dlib b/src/dlib index a97309c..c83ffab 160000 --- a/src/dlib +++ b/src/dlib @@ -1 +1 @@ -Subproject commit a97309cb04e0e802047586a5bacbacc9b8e9649b +Subproject commit c83ffabce69071a3e7a0af3f26aa420082eeda1f diff --git a/src/game2.d b/src/game2.d new file mode 100644 index 0000000..8dafa55 --- /dev/null +++ b/src/game2.d @@ -0,0 +1,60 @@ +import dlib; +import vulkan; + +struct GameState +{ + RenderState rds; +} + +struct RenderState +{ + Renderer rd; + struct + { + Pipeline pbr; + } pipelines; + struct + { + DescSetLayout globals; + DescSetLayout resources; + } desc_layouts; + struct + { + DescSet pbr; + } desc_sets; + struct + { + PipelineLayout pbr; + } layouts; +} + +GameState +InitGame(PlatformWindow* window) +{ + GameState g; + Init(&g.rds); + +} + +void +Init(RendererState* rds, PlatformWindow* window) +{ + version(linux) + { + PlatformHandles handles = { + conn: window.conn, + window: window.window, + }; + } + + rds.rd = InitRenderer(handles, MB(24), MB(32)); + + DescLayoutBinding[5] bindings = [ + { binding: 0, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All }, + { binding: 1, descriptorType: DT.Storage, descriptorCount: 1, stageFlags: SS.All }, + { binding: 2, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All }, + ]; + + rds.desc_layouts.pbr = + +} diff --git a/src/gears/game.d b/src/gears/game.d index 639e587..2b08381 100644 --- a/src/gears/game.d +++ b/src/gears/game.d @@ -153,9 +153,9 @@ InitGame(PlatformWindow* window) g.ui_vertex_buf = g.ui_vertex_mapped_buf.data; g.ui_index_buf = g.ui_index_mapped_buf.data; - u8[] font_data = LoadAssetData(&g.arena, "fonts/NuberNextCondensed-DemiBold.otf"); + u8[] font_data = CastStr!(u8)(import("NuberNextCondensed-DemiBold.otf")); g.font = OpenFont(font_data); - g.atlas_buf = CreateAtlas(&g.arena, g.font, 32, 256); + g.atlas_buf = CreateAtlas(&g.arena, g.font, 32, 512); CreateImageView(&g.rd, &g.font_tex, g.atlas_buf.atlas.width, g.atlas_buf.atlas.height, 4, g.atlas_buf.data); CreateImageView(&g.rd, &g.default_tex, 16, 16, 4, white_tex); diff --git a/src/gears/main.d b/src/gears/main.d index 0c0a676..0707b7c 100644 --- a/src/gears/main.d +++ b/src/gears/main.d @@ -5,15 +5,8 @@ import game; import core.simd; import core.stdc.string : memcpy; -// TODO: -// 1. Determine how to better handle inputs -// 2. Set up multisampling -// 3. Replace standard library calls with nogc replacements - void main(string[] argv) { - InitFreeType(); - PlatformWindow window = CreateWindow("Video Game", 1920, 1080); Game g = InitGame(&window); diff --git a/src/shaders/gui.frag.glsl b/src/shaders/gui.frag.glsl deleted file mode 100644 index 93b5149..0000000 --- a/src/shaders/gui.frag.glsl +++ /dev/null @@ -1,19 +0,0 @@ -#version 460 - -#extension GL_GOOGLE_include_directive : require - -#include "structures.layout" -#include "gui.layout" - -layout (location = 0) in struct FragDataIn { - vec4 color; - vec2 uv; -} FragData; - -layout (location = 0) out vec4 FragColor; - -void main() -{ - vec4 tex_color = texture(sampler2D(SpriteAtlas, SamplerNearest), FragData.uv); - FragColor = FragData.color * tex_color; -} diff --git a/src/shaders/gui.layout b/src/shaders/gui.layout deleted file mode 100644 index b7c9038..0000000 --- a/src/shaders/gui.layout +++ /dev/null @@ -1,9 +0,0 @@ -layout (set = 1, binding = 0) uniform texture2D SpriteAtlas; - -layout (set = 1, binding = 1) uniform Scale { - vec2 factor; -} S; - -layout (push_constant) uniform Constants { - vec2 res; -} PC; diff --git a/src/shaders/gui.vert.glsl b/src/shaders/gui.vert.glsl deleted file mode 100644 index e30f3b6..0000000 --- a/src/shaders/gui.vert.glsl +++ /dev/null @@ -1,57 +0,0 @@ -#version 460 - -#extension GL_GOOGLE_include_directive : require - -#include "structures.layout" -#include "gui.layout" - -layout (location = 0) in vec2 in_dst_start; -layout (location = 1) in vec2 in_dst_end; -layout (location = 2) in vec2 in_src_start; -layout (location = 3) in vec2 in_src_end; -layout (location = 4) in vec4 in_col; - -layout (location = 0) out struct FragDataOut { - vec4 color; - vec2 uv; -} FragData; - -vec2 Vertices[4] = vec2[4]( - vec2(-1.0, +1.0), - vec2(-1.0, -1.0), - vec2(+1.0, +1.0), - vec2(+1.0, -1.0) -); - -vec2 rotate(vec2 coords, float theta) -{ - return mat2(cos(theta), sin(theta), -sin(theta), cos(theta)) * coords; -} - -void main() -{ - ivec2 tex_size = textureSize(sampler2D(SpriteAtlas, SamplerNearest), 0); - - vec2 dst_half_size = (in_dst_end - in_dst_start) / 2; - vec2 dst_center = (in_dst_end + in_dst_start) / 2; - vec2 dst_pos = (Vertices[gl_VertexIndex] * dst_half_size + dst_center); - - vec2 src_half_size = (in_src_end - in_src_start) / 2; - vec2 src_center = (in_src_end + in_src_start) / 2; - vec2 src_pos = (Vertices[gl_VertexIndex] * src_half_size + src_center); - - vec2 uvs[4] = vec2[4]( - vec2(in_src_start.x, in_src_start.y), - vec2(in_src_start.x, in_src_end.y), - vec2(in_src_end.x, in_src_start.y), - vec2(in_src_end.x, in_src_end.y) - ); - - FragData.color = in_col; - FragData.uv = uvs[gl_VertexIndex] / tex_size; - - gl_Position = vec4((2 * dst_pos.x / PC.res.x - 1) * S.factor.x, - (2 * dst_pos.y / PC.res.y - 1) * S.factor.y, - 0, - 1); -} diff --git a/src/shaders/pbr.frag.glsl b/src/shaders/pbr.frag.glsl new file mode 100644 index 0000000..b05c6ac --- /dev/null +++ b/src/shaders/pbr.frag.glsl @@ -0,0 +1,78 @@ +#version 460 + +#extension GL_GOOGLE_include_directive : require + +#include "structures.layout" + +layout (location = 0) in struct FragDataIn { + vec3 normal; + vec2 uv; +} FragData; + +layout (location = 0, index = 0) out vec4 FragColor; + +vec4 CalculateDirectionalLight(vec4 diff_col, vec4 diff_samp, vec4 light_col, vec3 dir, vec3 normal) +{ + float diffuse_factor = max(dot(normal, -dir), 0.0); + + vec4 ambient = vec4(vec3(G.ambient_color * diff_col), diff_samp.a); + vec4 diffuse = vec4(vec3(light_col * diffuse_factor), diff_samp.a); + + diffuse *= diff_samp; + ambient *= diff_samp; + + return (ambient + diffuse); +} + +float UnPreMultLinearToSRGB(float col) +{ + return col < 0.0031308f ? col * 12.92f : (pow(col, 1.0f / 2.4f) * 1.055f) - 0.055f; +} + +vec4 UnPreMultLinearToSRGB(vec4 col) +{ + col.r = UnPreMultLinearToSRGB(col.x); + col.g = UnPreMultLinearToSRGB(col.x); + col.b = UnPreMultLinearToSRGB(col.x); + return col; +} + +void main() +{ + ivec2 coord = ivec2(gl_FragCoord.xy); + int store_mask = 0; + int view_size = int(G.res.x) * int(G.res.y); + int sample_id = 0; + int list_pos = view_size * OIT_LAYERS * sample_id + coord.y * int(G.res.x) + coord.x; + + vec4 col = ModelDiffuse; + vec4 tex_col = texture(sampler2D(AlbedoTex, SamplerNearest), FragData.uv); + + vec4 out_col = CalculateDirectionalLight(col, tex_col, G.light_color, G.light_direction, FragData.normal); + out_col.a = 1.0;// Materials[nonuniformEXT(PC.mat_id)].alpha; + + if(ALPHA_TEX) + { + vec4 alpha_col = texture(sampler2D(AlphaTex, SamplerNearest), FragData.uv); + out_col.a = alpha_col.a; + } + + //FragColor = out_col; + + //TODO: set up OIT again + vec4 srgb_col = out_col;// UnPreMultLinearToSRGB(out_col); + + uvec4 store_value = uvec4(packUnorm4x8(srgb_col), floatBitsToUint(gl_FragCoord.z), store_mask, 0); + + uint old_counter = imageAtomicAdd(ImageAux, coord, 1u); + if (old_counter < OIT_LAYERS) + { + imageStore(ImageABuffer, list_pos + int(old_counter) * view_size, store_value); + + FragColor = vec4(0.0); + } + else + { + FragColor = vec4(0.0); //vec4(out_col.rgb * out_col.a, out_col.a); // Change to vec4(0.0) to disable tail blending + } +} diff --git a/src/shaders/pbr.vert.glsl b/src/shaders/pbr.vert.glsl new file mode 100644 index 0000000..940b63b --- /dev/null +++ b/src/shaders/pbr.vert.glsl @@ -0,0 +1,54 @@ +#version 460 + +#extension GL_GOOGLE_include_directive : require +#extension GL_EXT_nonuniform_qualifier : require + +#include "structures.layout" + +/* +layout (set = 1, binding = 0) uniform texture2D AlbedoTexture; + +layout (set = 1, binding = 1) uniform texture2D AmbientTexture; + +layout (set = 1, binding = 2) uniform texture2D SpecularTexture; + +layout (set = 1, binding = 3) uniform texture2D AlphaTexture; + +layout (set = 1, binding = 4) uniform Material { + vec4 ambient; + vec4 diffuse; + vec4 specular; + bool albedo_has_texture; + bool ambient_has_texture; + bool specular_has_texture; + bool alpha_has_texture; + float shininess; + float alpha; +} Materials[]; +*/ + +layout (location = 0) in vec4 in_col; +layout (location = 1) in vec4 in_tangent; +layout (location = 2) in vec3 in_pos; +layout (location = 3) in vec3 in_normal; +layout (location = 4) in vec2 in_uv; + +layout (location = 0) out struct FragDataOut { + vec3 normal; + vec2 uv; +} FragData; + +mat4 y_matrix = mat4( + 1.0, 0.0, 0.0, 0.0, + 0.0, -1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0 +); + +void main() +{ + gl_Position = G.projection * G.view * ModelMatrix * vec4(in_pos, 1.0); + + FragData.uv = in_uv; + FragData.normal = mat3(ModelMatrix) * in_normal; +} diff --git a/src/shaders/structures.layout b/src/shaders/structures.layout index 216e707..ee4045d 100644 --- a/src/shaders/structures.layout +++ b/src/shaders/structures.layout @@ -1,4 +1,77 @@ +// DEFINES + +#define OIT_LAYERS 16 + +#define IMG_MAX 100 +#define BUF_MAX 25 +#define UNI_MAX 50 + +// SPEC CONSTANTS + +layout (constant_id = 0) const bool ALBEDO_TEX = false; +layout (constant_id = 1) const bool AMBIENT_TEX = false; +layout (constant_id = 2) const bool SPECULAR_TEX = false; +layout (constant_id = 3) const bool ALPHA_TEX = false; + +// SET 0 + layout (rgba16f, set = 0, binding = 0) uniform image2D DrawImage; -layout (set = 0, binding = 1) uniform sampler SamplerNearest; +layout (set = 0, binding = 1) uniform sampler SamplerNearest; +layout (set = 0, binding = 0) uniform Globals { + mat4 view; + mat4 projection; + vec4 light_color; + vec4 ambient_color; + vec3 light_direction; + vec2 res; +} G; + +layout (set = 0, binding = 1, rg32ui) uniform coherent uimageBuffer ImageABuffer; + +layout (set = 0, binding = 2, r32ui) uniform coherent uimage2D ImageAux; + +// SET 2 + +layout (set = 2, binding = 0) uniform texture2D Textures[IMG_MAX]; + +layout (set = 2, binding = 1) uniform Material { + vec4 ambient; + vec4 diffuse; + vec4 specular; + bool albedo_has_texture; + bool ambient_has_texture; + bool specular_has_texture; + bool alpha_has_texture; + float shininess; + float alpha; +} Materials[BUF_MAX]; + +layout (set = 2, binding = 2) uniform ModelState { + mat4 model_matrix; +} State[UNI_MAX]; + +// PUSH CONSTANTS + +layout (push_constant) uniform PushConstants { + uint t0; + uint t1; + uint t2; + uint t3; + uint m0; + uint s0; +} PC; + +// ALIAS MACROS + +#define ModelMatrix State[PC.s0].model_matrix +#define AlbedoTex Textures[PC.t0] +#define AmbientTex Textures[PC.t1] +#define SpecularTex Textures[PC.t2] +#define AlphaTex Textures[PC.t3] +#define ModelAmbient Materials[PC.m0].ambient +#define ModelDiffuse Materials[PC.m0].diffuse +#define ModelSpecular Materials[PC.m0].specular +#define ModelShininess Materials[PC.m0].shininess +#define ModelAlpha Materials[PC.m0].alpha