fix gltf/model loading some more, few bugs left but mostly working

This commit is contained in:
matthew 2025-11-23 15:36:39 +11:00
parent 3d04ad4c43
commit b4697cf890
12 changed files with 272 additions and 33 deletions

BIN
assets/models/Cube.bin Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

193
assets/models/Cube.gltf Normal file
View File

@ -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
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -1 +1 @@
Subproject commit 748c8ec00e098ba2a55ba1a6b831ed6f5b63f85a Subproject commit f96d30ae9ce76a95c46c48f01df4e9cb9520a1f2

@ -1 +1 @@
Subproject commit 292bb10214869da59a8fcaeda9bfce813ac28ad7 Subproject commit 44739bf6daf493d7b9640b92a9cf5e47fd846421

View File

@ -41,16 +41,20 @@ struct RenderState
Descriptor default_tex; Descriptor default_tex;
Descriptor default_mat; Descriptor default_mat;
DescSet default_mat_set;
Descriptor sampler;
Descriptor[2] globals_buffer; Descriptor[2] globals_buffer;
} }
struct ShaderGlobals struct ShaderGlobals
{ {
Vec4 ambient; Mat4 view;
Vec4 diffuse; Mat4 projection;
Vec4 specular; Vec4 light_col;
f32 shininess = 0.0; Vec4 ambient_col;
f32 alpha = 0.0; Vec3 light_dir;
Vec2 res;
} }
struct Model struct Model
@ -209,10 +213,11 @@ Init(RenderState* rds, PlatformWindow* window)
rds.materials = MATERIALS; rds.materials = MATERIALS;
rds.model_states = MODEL_STATES; rds.model_states = MODEL_STATES;
DescLayoutBinding[3] global_bindings = [ DescLayoutBinding[4] global_bindings = [
{ binding: 0, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All }, { binding: 0, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All },
{ binding: 1, descriptorType: DT.StorageTexelBuf, descriptorCount: 1, stageFlags: SS.All }, { binding: 1, descriptorType: DT.Sampler, descriptorCount: 1, stageFlags: SS.All },
{ binding: 2, descriptorType: DT.StorageImage, 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 = [ DescLayoutBinding[6] resource_bindings = [
@ -292,20 +297,55 @@ Init(RenderState* rds, PlatformWindow* window)
assert(result); assert(result);
} }
CreateBuffer(&rds.rd, &rds.globals_buffer[0], BT.Uniform, ShaderGlobals.sizeof, false, DT.Uniform); rds.sampler = CreateSampler(&rds.rd, MipmapMode.Nearest, 1);
CreateBuffer(&rds.rd, &rds.globals_buffer[1], BT.Uniform, ShaderGlobals.sizeof, false, DT.Uniform);
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); 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); 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_model = Upload(rds, &md);
g_object = CreateRenderObject(rds, &g_model); 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 void
@ -320,7 +360,7 @@ Render(RenderState* rds, RenderObject* obj)
{ {
Mesh* mesh = obj.model.meshes.ptr + i; 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); Bind(&rds.rd, rds.pipelines[obj.model.mat_pipelines[mesh.mat_id]], sets, false);
DrawIndexed(&rds.rd, mesh.length, 1, mesh.offset); DrawIndexed(&rds.rd, mesh.length, 1, mesh.offset);
@ -331,7 +371,7 @@ Descriptor
Upload(RenderState* rds, ImageData* image) Upload(RenderState* rds, ImageData* image)
{ {
Descriptor desc; 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; return desc;
} }
@ -359,10 +399,11 @@ Upload(RenderState* rds, ModelData* md)
model.tex[0] = rds.default_tex; model.tex[0] = rds.default_tex;
model.mats[0] = rds.default_mat; model.mats[0] = rds.default_mat;
model.mat_pipelines[0] = PID.PBRVVVVV; model.mat_pipelines[0] = PID.PBRVVVVV;
model.resource_sets[0] = rds.default_mat_set;
foreach(i; 1 .. md.tex.length) 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) 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.resource_sets[i] = AllocDescSet(&rds.rd, rds.desc_layout_resources);
model.mat_pipelines[i] = GetPBRID(albedo, normal, metal_rough, occlusion, emission); 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]); result = Transfer(&rds.rd, &model.mats[i].buf, &md.mats[i]);
assert(result); assert(result);
@ -413,7 +454,7 @@ CreateRenderObject(RenderState* rds, Model* model)
foreach(i; 0 .. 2) 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]); bool result = Transfer(&rds.rd, &rdobj.state_descs[i].buf, &rdobj.state[i]);
rdobj.state_sets[i] = AllocDescSet(&rds.rd, rds.desc_layout_state); rdobj.state_sets[i] = AllocDescSet(&rds.rd, rds.desc_layout_state);

View File

@ -42,7 +42,7 @@ vec4 UnPreMultLinearToSRGB(vec4 col)
void main() void main()
{ {
FragColor = FragData.col; FragColor = ALBEDO_TEX ? texture(sampler2D(AlbedoTex, SamplerNearest), FragData.uv) : Albedo;
/* /*
ivec2 coord = ivec2(gl_FragCoord.xy); ivec2 coord = ivec2(gl_FragCoord.xy);

View File

@ -6,6 +6,13 @@
#define f32 float #define f32 float
#define f64 double #define f64 double
struct MatData
{
vec4 col;
u32 padding;
f32 value;
};
// CONSTANTS // CONSTANTS
const u32 OIT_LAYERS = 16; const u32 OIT_LAYERS = 16;
@ -37,11 +44,10 @@ layout (constant_id = 4) const bool EMISSION_TEX = false;
// SET 0 // SET 0
layout (rgba16f, set = 0, binding = 0) uniform image2D DrawImage; layout (rgba16f, set = 0, binding = 0) uniform image2D DrawImage;
layout ( set = 0, binding = 1) uniform sampler SamplerNearest;
// SET 1 // SET 1
layout (set = 1, binding = 0) uniform Globals { layout (set = 1, binding = 0) uniform Globals {
mat4 view; mat4 view;
mat4 projection; mat4 projection;
vec4 light_color; vec4 light_color;
@ -49,8 +55,9 @@ layout (set = 1, binding = 0) uniform Globals {
vec3 light_direction; vec3 light_direction;
vec2 res; vec2 res;
} G; } G;
layout (set = 1, binding = 1, rg32ui) uniform coherent uimageBuffer ImageABuffer; layout (set = 1, binding = 1 ) uniform sampler SamplerNearest;
layout (set = 1, binding = 2, r32ui) uniform coherent uimage2D ImageAux; layout (set = 1, binding = 2, rg32ui) uniform coherent uimageBuffer ImageABuffer;
layout (set = 1, binding = 3, r32ui ) uniform coherent uimage2D ImageAux;
// SET 2 // 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 = 3) uniform texture2D OcclusionTex;
layout (set = 2, binding = 4) uniform texture2D EmissionTex; layout (set = 2, binding = 4) uniform texture2D EmissionTex;
layout (set = 2, binding = 5) uniform MaterialData { layout (set = 2, binding = 5) uniform MaterialData {
vec4 col; MatData data[MAT_MAX];
u32 padding; } Materials;
f32 value;
} Material[MAT_MAX];
layout (set = 3, binding = 0) uniform ModelState { layout (set = 3, binding = 0) uniform ModelState {
mat4 model_matrix; mat4 model_matrix;
@ -83,9 +88,9 @@ layout (push_constant) uniform PushConstants {
// ALIAS MACROS // ALIAS MACROS
#define ModelMatrix State.model_matrix #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 Metallic(uv) texture(sampler2D(MRTex, SamplerNearest), uv).b
#define Roughness(uv) texture(sampler2D(MRTex, SamplerNearest), uv).g #define Roughness(uv) texture(sampler2D(MRTex, SamplerNearest), uv).g
#define MetallicFactor Material[MAT_METALLIC].value #define MetallicFactor Materials.data[MAT_METALLIC].value
#define RoughnessFactor Material[MAT_ROUGHNESS].value #define RoughnessFactor Materials.data[MAT_ROUGHNESS].value
#define EmissiveFactor Material[MAT_EMISSION].value #define EmissiveFactor Materials.data[MAT_EMISSION].value