fix gltf/model loading some more, few bugs left but mostly working
This commit is contained in:
parent
3d04ad4c43
commit
b4697cf890
BIN
assets/models/Cube.bin
Normal file
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
193
assets/models/Cube.gltf
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
assets/models/Cube_BaseColor.png
Normal file
BIN
assets/models/Cube_BaseColor.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 871 KiB |
BIN
assets/models/Cube_MetallicRoughness.png
Normal file
BIN
assets/models/Cube_MetallicRoughness.png
Normal file
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
|
||||
2
src/dlib
2
src/dlib
@ -1 +1 @@
|
||||
Subproject commit 292bb10214869da59a8fcaeda9bfce813ac28ad7
|
||||
Subproject commit 44739bf6daf493d7b9640b92a9cf5e47fd846421
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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,7 +44,6 @@ 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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user