diff --git a/assets/models/Cube.bin b/assets/models/Cube.bin new file mode 100644 index 0000000..7dae4b0 Binary files /dev/null and b/assets/models/Cube.bin differ diff --git a/assets/models/Cube.gltf b/assets/models/Cube.gltf new file mode 100644 index 0000000..bc873da --- /dev/null +++ b/assets/models/Cube.gltf @@ -0,0 +1,193 @@ +{ + "accessors" : [ + { + "bufferView" : 0, + "byteOffset" : 0, + "componentType" : 5123, + "count" : 36, + "max" : [ + 35 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 1, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 36, + "max" : [ + 1.000000, + 1.000000, + 1.000001 + ], + "min" : [ + -1.000000, + -1.000000, + -1.000000 + ], + "type" : "VEC3" + }, + { + "bufferView" : 2, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 36, + "max" : [ + 1.000000, + 1.000000, + 1.000000 + ], + "min" : [ + -1.000000, + -1.000000, + -1.000000 + ], + "type" : "VEC3" + }, + { + "bufferView" : 3, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 36, + "max" : [ + 1.000000, + -0.000000, + -0.000000, + 1.000000 + ], + "min" : [ + 0.000000, + -0.000000, + -1.000000, + -1.000000 + ], + "type" : "VEC4" + }, + { + "bufferView" : 4, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 36, + "max" : [ + 1.000000, + 1.000000 + ], + "min" : [ + -1.000000, + -1.000000 + ], + "type" : "VEC2" + } + ], + "asset" : { + "generator" : "VKTS glTF 2.0 exporter", + "version" : "2.0" + }, + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 72, + "byteOffset" : 0, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 432, + "byteOffset" : 72, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 432, + "byteOffset" : 504, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 576, + "byteOffset" : 936, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 1512, + "target" : 34962 + } + ], + "buffers" : [ + { + "byteLength" : 1800, + "uri" : "Cube.bin" + } + ], + "images" : [ + { + "uri" : "Cube_BaseColor.png" + }, + { + "uri" : "Cube_MetallicRoughness.png" + } + ], + "materials" : [ + { + "name" : "Cube", + "pbrMetallicRoughness" : { + "baseColorTexture" : { + "index" : 0 + }, + "metallicRoughnessTexture" : { + "index" : 1 + } + } + } + ], + "meshes" : [ + { + "name" : "Cube", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 2, + "POSITION" : 1, + "TANGENT" : 3, + "TEXCOORD_0" : 4 + }, + "indices" : 0, + "material" : 0, + "mode" : 4 + } + ] + } + ], + "nodes" : [ + { + "mesh" : 0, + "name" : "Cube" + } + ], + "samplers" : [ + {} + ], + "scene" : 0, + "scenes" : [ + { + "nodes" : [ + 0 + ] + } + ], + "textures" : [ + { + "sampler" : 0, + "source" : 0 + }, + { + "sampler" : 0, + "source" : 1 + } + ] +} diff --git a/assets/models/Cube_BaseColor.png b/assets/models/Cube_BaseColor.png new file mode 100644 index 0000000..5e5cb20 Binary files /dev/null and b/assets/models/Cube_BaseColor.png differ diff --git a/assets/models/Cube_MetallicRoughness.png b/assets/models/Cube_MetallicRoughness.png new file mode 100644 index 0000000..efd2026 Binary files /dev/null and b/assets/models/Cube_MetallicRoughness.png differ diff --git a/assets/shaders/gradient.comp.spv b/assets/shaders/gradient.comp.spv index 241bd2c..235cf0b 100644 Binary files a/assets/shaders/gradient.comp.spv and b/assets/shaders/gradient.comp.spv differ diff --git a/assets/shaders/pbr.frag.spv b/assets/shaders/pbr.frag.spv index 799cd64..977e877 100644 Binary files a/assets/shaders/pbr.frag.spv and b/assets/shaders/pbr.frag.spv differ diff --git a/assets/shaders/pbr.vert.spv b/assets/shaders/pbr.vert.spv index fec4902..d88d115 100644 Binary files a/assets/shaders/pbr.vert.spv and b/assets/shaders/pbr.vert.spv differ diff --git a/src/VulkanRenderer b/src/VulkanRenderer index 748c8ec..f96d30a 160000 --- a/src/VulkanRenderer +++ b/src/VulkanRenderer @@ -1 +1 @@ -Subproject commit 748c8ec00e098ba2a55ba1a6b831ed6f5b63f85a +Subproject commit f96d30ae9ce76a95c46c48f01df4e9cb9520a1f2 diff --git a/src/dlib b/src/dlib index 292bb10..44739bf 160000 --- a/src/dlib +++ b/src/dlib @@ -1 +1 @@ -Subproject commit 292bb10214869da59a8fcaeda9bfce813ac28ad7 +Subproject commit 44739bf6daf493d7b9640b92a9cf5e47fd846421 diff --git a/src/gears/game2.d b/src/gears/game2.d index 5bed4ec..dc4fd17 100644 --- a/src/gears/game2.d +++ b/src/gears/game2.d @@ -41,16 +41,20 @@ struct RenderState Descriptor default_tex; Descriptor default_mat; + DescSet default_mat_set; + + Descriptor sampler; Descriptor[2] globals_buffer; } struct ShaderGlobals { - Vec4 ambient; - Vec4 diffuse; - Vec4 specular; - f32 shininess = 0.0; - f32 alpha = 0.0; + Mat4 view; + Mat4 projection; + Vec4 light_col; + Vec4 ambient_col; + Vec3 light_dir; + Vec2 res; } struct Model @@ -209,10 +213,11 @@ Init(RenderState* rds, PlatformWindow* window) rds.materials = MATERIALS; rds.model_states = MODEL_STATES; - DescLayoutBinding[3] global_bindings = [ + DescLayoutBinding[4] global_bindings = [ { binding: 0, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All }, - { binding: 1, descriptorType: DT.StorageTexelBuf, descriptorCount: 1, stageFlags: SS.All }, - { binding: 2, descriptorType: DT.StorageImage, descriptorCount: 1, stageFlags: SS.All }, + { binding: 1, descriptorType: DT.Sampler, descriptorCount: 1, stageFlags: SS.All }, + { binding: 2, descriptorType: DT.StorageTexelBuf, descriptorCount: 1, stageFlags: SS.All }, + { binding: 3, descriptorType: DT.StorageImage, descriptorCount: 1, stageFlags: SS.All }, ]; DescLayoutBinding[6] resource_bindings = [ @@ -292,20 +297,55 @@ Init(RenderState* rds, PlatformWindow* window) assert(result); } - CreateBuffer(&rds.rd, &rds.globals_buffer[0], BT.Uniform, ShaderGlobals.sizeof, false, DT.Uniform); - CreateBuffer(&rds.rd, &rds.globals_buffer[1], BT.Uniform, ShaderGlobals.sizeof, false, DT.Uniform); + rds.sampler = CreateSampler(&rds.rd, MipmapMode.Nearest, 1); - ModelData md = LoadGLTF(&rds.frame_arenas[0], "assets/models/DamagedHelmet.glb"); + rds.globals.view = Mat4Identity(); + rds.globals.res = GetExtent(&rds.rd); + + rds.globals.projection = Perspective(Radians(90.0), rds.globals.res.x/rds.globals.res.y, 10000.0, 0.1); + Translate(&rds.globals.view, Vec3(0.0, 0.0, 5.0)); + + CreateBuffer(&rds.rd, &rds.globals_buffer[0], BT.Uniform, ShaderGlobals.sizeof, false, DT.Uniform, 0); + CreateBuffer(&rds.rd, &rds.globals_buffer[1], BT.Uniform, ShaderGlobals.sizeof, false, DT.Uniform, 0); + + bool result = true; + result &= Transfer(&rds.rd, &rds.globals_buffer[0].buf, &rds.globals); + result &= Transfer(&rds.rd, &rds.globals_buffer[1].buf, &rds.globals); + + Write(&rds.rd, rds.desc_set_globals[0], [rds.globals_buffer[0], rds.sampler]); + Write(&rds.rd, rds.desc_set_globals[1], [rds.globals_buffer[1], rds.sampler]); + + ModelData md = LoadGLTF(&rds.frame_arenas[0], "assets/models/Cube.gltf"); rds.default_tex = Upload(rds, &DEFAULT_IMAGE); - CreateBuffer(&rds.rd, &rds.default_mat, BT.Uniform, Material.sizeof, false, DT.Uniform); + CreateBuffer(&rds.rd, &rds.default_mat, BT.Uniform, Material.sizeof, false, DT.Uniform, 5); - bool result = Transfer(&rds.rd, &rds.default_mat.buf, &DEFAULT_MATERIAL); + result = Transfer(&rds.rd, &rds.default_mat.buf, &DEFAULT_MATERIAL); assert(result); + rds.default_mat_set = AllocDescSet(&rds.rd, rds.desc_layout_resources); + + Descriptor[6] descs = [ + rds.default_tex, + rds.default_tex, + rds.default_tex, + rds.default_tex, + rds.default_tex, + rds.default_mat, + ]; + + foreach(j; 0 .. descs.length) + { + descs[j].binding = cast(u32)j; + } + + Write(&rds.rd, rds.default_mat_set, descs); + g_model = Upload(rds, &md); g_object = CreateRenderObject(rds, &g_model); + + SetClearColors(&rds.rd, [0.0, 0.0, 0.0, 1.0], [0.0, 0.0, 0.0, 0.0]); } void @@ -320,7 +360,7 @@ Render(RenderState* rds, RenderObject* obj) { Mesh* mesh = obj.model.meshes.ptr + i; - sets[1] = obj.model.resource_sets[i]; + sets[1] = obj.model.resource_sets[mesh.mat_id]; Bind(&rds.rd, rds.pipelines[obj.model.mat_pipelines[mesh.mat_id]], sets, false); DrawIndexed(&rds.rd, mesh.length, 1, mesh.offset); @@ -331,7 +371,7 @@ Descriptor Upload(RenderState* rds, ImageData* image) { Descriptor desc; - CreateImageView(&rds.rd, &desc, image.w, image.h, image.ch, image.data, DT.Image); + CreateImageView(&rds.rd, &desc, image.w, image.h, image.ch, image.data, DT.Image, 0); return desc; } @@ -359,10 +399,11 @@ Upload(RenderState* rds, ModelData* md) model.tex[0] = rds.default_tex; model.mats[0] = rds.default_mat; model.mat_pipelines[0] = PID.PBRVVVVV; + model.resource_sets[0] = rds.default_mat_set; foreach(i; 1 .. md.tex.length) { - CreateImageView(&rds.rd, &model.tex[i], md.tex[i].w, md.tex[i].h, md.tex[i].ch, md.tex[i].data, DT.Image); + CreateImageView(&rds.rd, &model.tex[i], md.tex[i].w, md.tex[i].h, md.tex[i].ch, md.tex[i].data, DT.Image, 0); } foreach(i; 1 .. md.mats.length) @@ -378,7 +419,7 @@ Upload(RenderState* rds, ModelData* md) model.resource_sets[i] = AllocDescSet(&rds.rd, rds.desc_layout_resources); model.mat_pipelines[i] = GetPBRID(albedo, normal, metal_rough, occlusion, emission); - CreateBuffer(&rds.rd, &model.mats[i], BT.Uniform, Material.sizeof, false, DT.Uniform); + CreateBuffer(&rds.rd, &model.mats[i], BT.Uniform, Material.sizeof, false, DT.Uniform, 5); result = Transfer(&rds.rd, &model.mats[i].buf, &md.mats[i]); assert(result); @@ -413,7 +454,7 @@ CreateRenderObject(RenderState* rds, Model* model) foreach(i; 0 .. 2) { - CreateBuffer(&rds.rd, &rdobj.state_descs[i], BT.Uniform, ModelState.sizeof, false, DT.Uniform); + CreateBuffer(&rds.rd, &rdobj.state_descs[i], BT.Uniform, ModelState.sizeof, false, DT.Uniform, 0); bool result = Transfer(&rds.rd, &rdobj.state_descs[i].buf, &rdobj.state[i]); rdobj.state_sets[i] = AllocDescSet(&rds.rd, rds.desc_layout_state); diff --git a/src/shaders/pbr.frag.glsl b/src/shaders/pbr.frag.glsl index 1ce8bd6..ab17121 100644 --- a/src/shaders/pbr.frag.glsl +++ b/src/shaders/pbr.frag.glsl @@ -42,7 +42,7 @@ vec4 UnPreMultLinearToSRGB(vec4 col) void main() { - FragColor = FragData.col; + FragColor = ALBEDO_TEX ? texture(sampler2D(AlbedoTex, SamplerNearest), FragData.uv) : Albedo; /* ivec2 coord = ivec2(gl_FragCoord.xy); diff --git a/src/shaders/structures.layout b/src/shaders/structures.layout index 5b9a729..b05e8bc 100644 --- a/src/shaders/structures.layout +++ b/src/shaders/structures.layout @@ -6,6 +6,13 @@ #define f32 float #define f64 double +struct MatData +{ + vec4 col; + u32 padding; + f32 value; +}; + // CONSTANTS const u32 OIT_LAYERS = 16; @@ -37,11 +44,10 @@ layout (constant_id = 4) const bool EMISSION_TEX = false; // SET 0 layout (rgba16f, set = 0, binding = 0) uniform image2D DrawImage; -layout ( set = 0, binding = 1) uniform sampler SamplerNearest; // SET 1 -layout (set = 1, binding = 0) uniform Globals { +layout (set = 1, binding = 0) uniform Globals { mat4 view; mat4 projection; vec4 light_color; @@ -49,8 +55,9 @@ layout (set = 1, binding = 0) uniform Globals { vec3 light_direction; vec2 res; } G; -layout (set = 1, binding = 1, rg32ui) uniform coherent uimageBuffer ImageABuffer; -layout (set = 1, binding = 2, r32ui) uniform coherent uimage2D ImageAux; +layout (set = 1, binding = 1 ) uniform sampler SamplerNearest; +layout (set = 1, binding = 2, rg32ui) uniform coherent uimageBuffer ImageABuffer; +layout (set = 1, binding = 3, r32ui ) uniform coherent uimage2D ImageAux; // SET 2 @@ -60,10 +67,8 @@ layout (set = 2, binding = 2) uniform texture2D MRTex; // Metallic Roughness layout (set = 2, binding = 3) uniform texture2D OcclusionTex; layout (set = 2, binding = 4) uniform texture2D EmissionTex; layout (set = 2, binding = 5) uniform MaterialData { - vec4 col; - u32 padding; - f32 value; -} Material[MAT_MAX]; + MatData data[MAT_MAX]; +} Materials; layout (set = 3, binding = 0) uniform ModelState { mat4 model_matrix; @@ -83,9 +88,9 @@ layout (push_constant) uniform PushConstants { // ALIAS MACROS #define ModelMatrix State.model_matrix -#define Albedo Material[MAT_ALBEDO].col; +#define Albedo Materials.data[MAT_ALBEDO].col; #define Metallic(uv) texture(sampler2D(MRTex, SamplerNearest), uv).b #define Roughness(uv) texture(sampler2D(MRTex, SamplerNearest), uv).g -#define MetallicFactor Material[MAT_METALLIC].value -#define RoughnessFactor Material[MAT_ROUGHNESS].value -#define EmissiveFactor Material[MAT_EMISSION].value +#define MetallicFactor Materials.data[MAT_METALLIC].value +#define RoughnessFactor Materials.data[MAT_ROUGHNESS].value +#define EmissiveFactor Materials.data[MAT_EMISSION].value