loading/rendering set up, has bugs
This commit is contained in:
parent
bd4e1cc07e
commit
3d04ad4c43
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
|||||||
Subproject commit c42238a456f5048c7d1b2d5ebd71ecf13bb10ece
|
Subproject commit 748c8ec00e098ba2a55ba1a6b831ed6f5b63f85a
|
||||||
2
src/dlib
2
src/dlib
@ -1 +1 @@
|
|||||||
Subproject commit 493c17cba26952861ae4c5402f1676013b8317c6
|
Subproject commit 292bb10214869da59a8fcaeda9bfce813ac28ad7
|
||||||
@ -21,6 +21,9 @@ struct RenderState
|
|||||||
Arena[2] frame_arenas;
|
Arena[2] frame_arenas;
|
||||||
Arena perm_arena;
|
Arena perm_arena;
|
||||||
|
|
||||||
|
u64 frame;
|
||||||
|
u64 frame_idx;
|
||||||
|
|
||||||
PushConst pc;
|
PushConst pc;
|
||||||
ShaderGlobals globals;
|
ShaderGlobals globals;
|
||||||
|
|
||||||
@ -36,8 +39,9 @@ struct RenderState
|
|||||||
Buffer[] model_states;
|
Buffer[] model_states;
|
||||||
u64 itex, imat, istate;
|
u64 itex, imat, istate;
|
||||||
|
|
||||||
ImageView placeholder_tex;
|
Descriptor default_tex;
|
||||||
Buffer globals_buffer;
|
Descriptor default_mat;
|
||||||
|
Descriptor[2] globals_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ShaderGlobals
|
struct ShaderGlobals
|
||||||
@ -49,12 +53,29 @@ struct ShaderGlobals
|
|||||||
f32 alpha = 0.0;
|
f32 alpha = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ModelRenderInfo
|
struct Model
|
||||||
{
|
{
|
||||||
PushConst pc;
|
Buffer vtx_buf;
|
||||||
PipelineID pid;
|
Buffer idx_buf;
|
||||||
|
Descriptor[] tex;
|
||||||
|
Descriptor[] mats;
|
||||||
|
PipelineID[] mat_pipelines;
|
||||||
|
DescSet[] resource_sets;
|
||||||
|
Mesh[] meshes;
|
||||||
|
}
|
||||||
|
|
||||||
alias pc this;
|
struct RenderObject
|
||||||
|
{
|
||||||
|
Model* model;
|
||||||
|
Descriptor[2] state_descs;
|
||||||
|
ModelState[2] state;
|
||||||
|
DescSet[2] state_sets;
|
||||||
|
bool[2] pending_update;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Entity
|
||||||
|
{
|
||||||
|
Model* model;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ModelState
|
struct ModelState
|
||||||
@ -64,45 +85,59 @@ struct ModelState
|
|||||||
|
|
||||||
enum PBRMod : u32
|
enum PBRMod : u32
|
||||||
{
|
{
|
||||||
AlbedoValue = 0x0001,
|
None = 0x000,
|
||||||
AmbientValue = 0x0002,
|
AlbedoTexture = 0x001,
|
||||||
SpecularValue = 0x0004,
|
NormalTexture = 0x002,
|
||||||
AlphaValue = 0x0008,
|
MetalRoughTexture = 0x004,
|
||||||
AlbedoTexture = 0x0010,
|
OcclusionTexture = 0x008,
|
||||||
AmbientTexture = 0x0020,
|
EmissionTexture = 0x010,
|
||||||
SpecularTexture = 0x0040,
|
|
||||||
AlphaTexture = 0x0080,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum PipelineID : u32
|
enum PipelineID
|
||||||
{
|
{
|
||||||
None,
|
None,
|
||||||
PBRVVVV,
|
PBRVVVVV,
|
||||||
PBRTVVV,
|
PBRTVVVV,
|
||||||
PBRVTVV,
|
PBRVTVVV,
|
||||||
PBRVVTV,
|
PBRTTVVV,
|
||||||
PBRVVVT,
|
PBRVVTVV,
|
||||||
PBRTTVV,
|
PBRTVTVV,
|
||||||
PBRTVTV,
|
PBRVTTVV,
|
||||||
PBRTVVT,
|
PBRTTTVV,
|
||||||
PBRVTTV,
|
PBRVVVTV,
|
||||||
PBRVTVT,
|
PBRTVVTV,
|
||||||
PBRVVTT,
|
PBRVTVTV,
|
||||||
PBRVTTT,
|
PBRTTVTV,
|
||||||
PBRTVTT,
|
PBRVVTTV,
|
||||||
PBRTTVT,
|
PBRTVTTV,
|
||||||
PBRTTTV,
|
PBRVTTTV,
|
||||||
PBRTTTT,
|
PBRTTTTV,
|
||||||
|
PBRVVVVT,
|
||||||
|
PBRTVVVT,
|
||||||
|
PBRVTVVT,
|
||||||
|
PBRTTVVT,
|
||||||
|
PBRVVTVT,
|
||||||
|
PBRTVTVT,
|
||||||
|
PBRVTTVT,
|
||||||
|
PBRTTTVT,
|
||||||
|
PBRVVVTT,
|
||||||
|
PBRTVVTT,
|
||||||
|
PBRVTVTT,
|
||||||
|
PBRTTVTT,
|
||||||
|
PBRVVTTT,
|
||||||
|
PBRTVTTT,
|
||||||
|
PBRVTTTT,
|
||||||
|
PBRTTTTT,
|
||||||
Max,
|
Max,
|
||||||
}
|
}
|
||||||
|
|
||||||
alias PID = PipelineID;
|
alias PID = PipelineID;
|
||||||
|
|
||||||
const PID[] PBR_PIPELINES = [
|
const PID[] PBR_PIPELINES = [
|
||||||
PID.PBRVVVV, PID.PBRTVVV, PID.PBRVTVV, PID.PBRVVTV,
|
PID.PBRVVVVV, PID.PBRTVVVV, PID.PBRVTVVV, PID.PBRTTVVV, PID.PBRVVTVV, PID.PBRTVTVV, PID.PBRVTTVV, PID.PBRTTTVV,
|
||||||
PID.PBRVVVT, PID.PBRTTVV, PID.PBRTVTV, PID.PBRTVVT,
|
PID.PBRVVVTV, PID.PBRTVVTV, PID.PBRVTVTV, PID.PBRTTVTV, PID.PBRVVTTV, PID.PBRTVTTV, PID.PBRVTTTV, PID.PBRTTTTV,
|
||||||
PID.PBRVTTV, PID.PBRVTVT, PID.PBRVVTT, PID.PBRTTTV,
|
PID.PBRVVVVT, PID.PBRTVVVT, PID.PBRVTVVT, PID.PBRTTVVT, PID.PBRVVTVT, PID.PBRTVTVT, PID.PBRVTTVT, PID.PBRTTTVT,
|
||||||
PID.PBRTTVT, PID.PBRTVTT, PID.PBRVTTT, PID.PBRTTTT,
|
PID.PBRVVVTT, PID.PBRTVVTT, PID.PBRVTVTT, PID.PBRTTVTT, PID.PBRVVTTT, PID.PBRTVTTT, PID.PBRVTTTT, PID.PBRTTTTT,
|
||||||
];
|
];
|
||||||
|
|
||||||
struct PushConst
|
struct PushConst
|
||||||
@ -130,12 +165,22 @@ struct PushConst
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ModelData g_box;
|
Model g_model;
|
||||||
|
RenderObject g_object;
|
||||||
|
|
||||||
void
|
void
|
||||||
RunCycle(GameState* g)
|
RunCycle(GameState* g)
|
||||||
{
|
{
|
||||||
|
BeginFrame(&g.rds.rd);
|
||||||
|
BeginRendering(&g.rds.rd);
|
||||||
|
|
||||||
|
Render(&g.rds, &g_object);
|
||||||
|
|
||||||
|
FinishRendering(&g.rds.rd);
|
||||||
|
SubmitAndPresent(&g.rds.rd);
|
||||||
|
|
||||||
|
g.rds.frame += 1;
|
||||||
|
g.rds.frame_idx = g.rds.frame % 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
GameState
|
GameState
|
||||||
@ -175,7 +220,7 @@ Init(RenderState* rds, PlatformWindow* window)
|
|||||||
{ binding: 1, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All },
|
{ binding: 1, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All },
|
||||||
{ binding: 2, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All },
|
{ binding: 2, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All },
|
||||||
{ binding: 3, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All },
|
{ binding: 3, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All },
|
||||||
{ binding: 4, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All },
|
{ binding: 4, descriptorType: DT.Image, descriptorCount: 1, stageFlags: SS.All },
|
||||||
{ binding: 5, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All },
|
{ binding: 5, descriptorType: DT.Uniform, descriptorCount: 1, stageFlags: SS.All },
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -209,7 +254,7 @@ Init(RenderState* rds, PlatformWindow* window)
|
|||||||
rds.desc_set_globals[i] = AllocDescSet(&rds.rd, rds.desc_layout_globals);
|
rds.desc_set_globals[i] = AllocDescSet(&rds.rd, rds.desc_layout_globals);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32[4] spec_data;
|
u32[5] spec_data;
|
||||||
|
|
||||||
Specialization spec = {
|
Specialization spec = {
|
||||||
data: spec_data.ptr,
|
data: spec_data.ptr,
|
||||||
@ -219,6 +264,7 @@ Init(RenderState* rds, PlatformWindow* window)
|
|||||||
{ constantID: 1, size: u32.sizeof, offset: u32.sizeof*1 },
|
{ constantID: 1, size: u32.sizeof, offset: u32.sizeof*1 },
|
||||||
{ constantID: 2, size: u32.sizeof, offset: u32.sizeof*2 },
|
{ constantID: 2, size: u32.sizeof, offset: u32.sizeof*2 },
|
||||||
{ constantID: 3, size: u32.sizeof, offset: u32.sizeof*3 },
|
{ constantID: 3, size: u32.sizeof, offset: u32.sizeof*3 },
|
||||||
|
{ constantID: 4, size: u32.sizeof, offset: u32.sizeof*4 },
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -237,59 +283,198 @@ Init(RenderState* rds, PlatformWindow* window)
|
|||||||
{
|
{
|
||||||
u32 mod = PIDToPBR(pid);
|
u32 mod = PIDToPBR(pid);
|
||||||
spec_data[0] = mod & PBRMod.AlbedoTexture;
|
spec_data[0] = mod & PBRMod.AlbedoTexture;
|
||||||
spec_data[1] = mod & PBRMod.AmbientTexture;
|
spec_data[1] = mod & PBRMod.NormalTexture;
|
||||||
spec_data[2] = mod & PBRMod.SpecularTexture;
|
spec_data[2] = mod & PBRMod.MetalRoughTexture;
|
||||||
spec_data[3] = mod & PBRMod.AlphaTexture;
|
spec_data[3] = mod & PBRMod.OcclusionTexture;
|
||||||
|
spec_data[4] = mod & PBRMod.EmissionTexture;
|
||||||
|
|
||||||
bool result = CreateGraphicsPipeline(&rds.rd, &rds.pipelines[pid], &pbr_info);
|
bool result = CreateGraphicsPipeline(&rds.rd, &rds.pipelines[pid], &pbr_info);
|
||||||
assert(result);
|
assert(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
const u64 tex_size = 32*32*4;
|
CreateBuffer(&rds.rd, &rds.globals_buffer[0], BT.Uniform, ShaderGlobals.sizeof, false, DT.Uniform);
|
||||||
u8[tex_size] placeholder_tex;
|
CreateBuffer(&rds.rd, &rds.globals_buffer[1], BT.Uniform, ShaderGlobals.sizeof, false, DT.Uniform);
|
||||||
|
|
||||||
u8[4] magenta = [255, 0, 255, 255];
|
|
||||||
u8[4] black = [0, 0, 0, 255];
|
|
||||||
u64 half = tex_size/2;
|
|
||||||
for(u64 i = 0; i < tex_size; i += 32)
|
|
||||||
{
|
|
||||||
bool swap = i <= half;
|
|
||||||
for(u64 j = 0; j < 16; j += 4)
|
|
||||||
{
|
|
||||||
placeholder_tex[i+j .. i+j+4] = !swap ? magenta[0 .. $] : black[0 .. $];
|
|
||||||
placeholder_tex[i+j+16 .. i+j+16+4] = !swap ? black[0 .. $] : magenta[0 .. $];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CreateImageView(&rds.rd, &rds.placeholder_tex, 32, 32, 4, placeholder_tex);
|
|
||||||
|
|
||||||
CreateBuffer(&rds.rd, &rds.globals_buffer, BT.Uniform, ShaderGlobals.sizeof, false);
|
|
||||||
|
|
||||||
ModelData md = LoadGLTF(&rds.frame_arenas[0], "assets/models/DamagedHelmet.glb");
|
ModelData md = LoadGLTF(&rds.frame_arenas[0], "assets/models/DamagedHelmet.glb");
|
||||||
|
|
||||||
|
rds.default_tex = Upload(rds, &DEFAULT_IMAGE);
|
||||||
|
|
||||||
|
CreateBuffer(&rds.rd, &rds.default_mat, BT.Uniform, Material.sizeof, false, DT.Uniform);
|
||||||
|
|
||||||
|
bool result = Transfer(&rds.rd, &rds.default_mat.buf, &DEFAULT_MATERIAL);
|
||||||
|
assert(result);
|
||||||
|
|
||||||
|
g_model = Upload(rds, &md);
|
||||||
|
g_object = CreateRenderObject(rds, &g_model);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Render(RenderState* rds, RenderObject* obj)
|
||||||
|
{
|
||||||
|
DescSet[3] sets;
|
||||||
|
sets[0] = rds.desc_set_globals[rds.frame_idx];
|
||||||
|
sets[2] = obj.state_sets[rds.frame_idx];
|
||||||
|
|
||||||
|
BindBuffers(&rds.rd, &obj.model.idx_buf, &obj.model.vtx_buf);
|
||||||
|
foreach(i; 0 .. obj.model.meshes.length)
|
||||||
|
{
|
||||||
|
Mesh* mesh = obj.model.meshes.ptr + i;
|
||||||
|
|
||||||
|
sets[1] = obj.model.resource_sets[i];
|
||||||
|
|
||||||
|
Bind(&rds.rd, rds.pipelines[obj.model.mat_pipelines[mesh.mat_id]], sets, false);
|
||||||
|
DrawIndexed(&rds.rd, mesh.length, 1, mesh.offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Descriptor
|
||||||
|
Upload(RenderState* rds, ImageData* image)
|
||||||
|
{
|
||||||
|
Descriptor desc;
|
||||||
|
CreateImageView(&rds.rd, &desc, image.w, image.h, image.ch, image.data, DT.Image);
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Model
|
||||||
|
Upload(RenderState* rds, ModelData* md)
|
||||||
|
{
|
||||||
|
Model model = {
|
||||||
|
meshes: md.meshes,
|
||||||
|
};
|
||||||
|
|
||||||
|
CreateBuffer(&rds.rd, &model.vtx_buf, BT.Vertex, Vertex.sizeof*md.vtx_buf.length, false);
|
||||||
|
CreateBuffer(&rds.rd, &model.idx_buf, BT.Index, u32.sizeof*md.idx_buf.length, false);
|
||||||
|
|
||||||
|
bool result = true;
|
||||||
|
result &= Transfer(&rds.rd, &model.vtx_buf, md.vtx_buf);
|
||||||
|
result &= Transfer(&rds.rd, &model.idx_buf, md.idx_buf);
|
||||||
|
|
||||||
|
assert(result, "Failed to transfer vtx/idx buffer");
|
||||||
|
|
||||||
|
model.tex = Alloc!(Descriptor)(md.tex.length);
|
||||||
|
model.mats = Alloc!(Descriptor)(md.mats.length);
|
||||||
|
model.mat_pipelines = Alloc!(PipelineID)(md.mats.length);
|
||||||
|
model.resource_sets = Alloc!(DescSet)(md.mats.length);
|
||||||
|
|
||||||
|
model.tex[0] = rds.default_tex;
|
||||||
|
model.mats[0] = rds.default_mat;
|
||||||
|
model.mat_pipelines[0] = PID.PBRVVVVV;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(i; 1 .. md.mats.length)
|
||||||
|
{
|
||||||
|
MaterialMap[] maps = md.mats[i].maps;
|
||||||
|
|
||||||
|
bool albedo = maps[MMI.Albedo].tex_id > 0,
|
||||||
|
normal = maps[MMI.Normal].tex_id > 0,
|
||||||
|
metal_rough = maps[MMI.Metallic].tex_id > 0,
|
||||||
|
occlusion = maps[MMI.Occlusion].tex_id > 0,
|
||||||
|
emission = maps[MMI.Emission].tex_id > 0;
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
result = Transfer(&rds.rd, &model.mats[i].buf, &md.mats[i]);
|
||||||
|
assert(result);
|
||||||
|
|
||||||
|
Descriptor[6] descs = [
|
||||||
|
model.tex[maps[MMI.Albedo].tex_id],
|
||||||
|
model.tex[maps[MMI.Normal].tex_id],
|
||||||
|
model.tex[maps[MMI.Metallic].tex_id],
|
||||||
|
model.tex[maps[MMI.Occlusion].tex_id],
|
||||||
|
model.tex[maps[MMI.Emission].tex_id],
|
||||||
|
model.mats[i],
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach(j; 0 .. descs.length)
|
||||||
|
{
|
||||||
|
descs[j].binding = cast(u32)j;
|
||||||
|
}
|
||||||
|
|
||||||
|
Write(&rds.rd, model.resource_sets[i], descs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderObject
|
||||||
|
CreateRenderObject(RenderState* rds, Model* model)
|
||||||
|
{
|
||||||
|
RenderObject rdobj = {
|
||||||
|
model: model,
|
||||||
|
state: [DefaultModelState(), DefaultModelState()],
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach(i; 0 .. 2)
|
||||||
|
{
|
||||||
|
CreateBuffer(&rds.rd, &rdobj.state_descs[i], BT.Uniform, ModelState.sizeof, false, DT.Uniform);
|
||||||
|
bool result = Transfer(&rds.rd, &rdobj.state_descs[i].buf, &rdobj.state[i]);
|
||||||
|
|
||||||
|
rdobj.state_sets[i] = AllocDescSet(&rds.rd, rds.desc_layout_state);
|
||||||
|
Write(&rds.rd, rdobj.state_sets[i], &rdobj.state_descs[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rdobj;
|
||||||
|
}
|
||||||
|
|
||||||
|
ModelState
|
||||||
|
DefaultModelState()
|
||||||
|
{
|
||||||
|
return ModelState(
|
||||||
|
matrix: Mat4Identity(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
PipelineID
|
||||||
|
GetPBRID(bool albedo, bool normal, bool metal_rough, bool occlusion, bool emission)
|
||||||
|
{
|
||||||
|
return PBRToPID(GetPBRMod(albedo, normal, metal_rough, occlusion, emission));
|
||||||
}
|
}
|
||||||
|
|
||||||
PipelineID
|
PipelineID
|
||||||
PBRToPID(u32 mod)
|
PBRToPID(u32 mod)
|
||||||
{
|
{
|
||||||
switch(mod)
|
switch(mod) with(PID)
|
||||||
{
|
{
|
||||||
case GetPBRMod(false, false, false, false): return PID.PBRVVVV;
|
case GetPBRMod(false, false, false, false, false): return PBRVVVVV;
|
||||||
case GetPBRMod(true , false, false, false): return PID.PBRTVVV;
|
case GetPBRMod(true , false, false, false, false): return PBRTVVVV;
|
||||||
case GetPBRMod(false, true , false, false): return PID.PBRVTVV;
|
case GetPBRMod(false, true , false, false, false): return PBRVTVVV;
|
||||||
case GetPBRMod(false, false, true , false): return PID.PBRVVTV;
|
case GetPBRMod(true , true , false, false, false): return PBRTTVVV;
|
||||||
case GetPBRMod(false, false, false, true ): return PID.PBRVVVT;
|
case GetPBRMod(false, false, true , false, false): return PBRVVTVV;
|
||||||
case GetPBRMod(true , true , false, false): return PID.PBRTTVV;
|
case GetPBRMod(true , false, true , false, false): return PBRTVTVV;
|
||||||
case GetPBRMod(true , false, true , false): return PID.PBRTVTV;
|
case GetPBRMod(false, true , true , false, false): return PBRVTTVV;
|
||||||
case GetPBRMod(true , false, false, true ): return PID.PBRTVVT;
|
case GetPBRMod(true , true , true , false, false): return PBRTTTVV;
|
||||||
case GetPBRMod(false, true , true , false): return PID.PBRVTTV;
|
case GetPBRMod(false, false, false, true , false): return PBRVVVTV;
|
||||||
case GetPBRMod(false, true , false, true ): return PID.PBRVTVT;
|
case GetPBRMod(true , false, false, true , false): return PBRTVVTV;
|
||||||
case GetPBRMod(false, false, true , true ): return PID.PBRVVTT;
|
case GetPBRMod(false, true , false, true , false): return PBRVTVTV;
|
||||||
case GetPBRMod(false, true , true , true ): return PID.PBRVTTT;
|
case GetPBRMod(true , true , false, true , false): return PBRTTVTV;
|
||||||
case GetPBRMod(true , false, true , true ): return PID.PBRTVTT;
|
case GetPBRMod(false, false, true , true , false): return PBRVVTTV;
|
||||||
case GetPBRMod(true , true , false, true ): return PID.PBRTTVT;
|
case GetPBRMod(true , false, true , true , false): return PBRTVTTV;
|
||||||
case GetPBRMod(true , true , true , false): return PID.PBRTTTV;
|
case GetPBRMod(false, true , true , true , false): return PBRVTTTV;
|
||||||
case GetPBRMod(true , true , true , true ): return PID.PBRTTTT;
|
case GetPBRMod(true , true , true , true , false): return PBRTTTTV;
|
||||||
default: return PID.None;
|
case GetPBRMod(false, false, false, false, true ): return PBRVVVVT;
|
||||||
|
case GetPBRMod(true , false, false, false, true ): return PBRTVVVT;
|
||||||
|
case GetPBRMod(false, true , false, false, true ): return PBRVTVVT;
|
||||||
|
case GetPBRMod(true , true , false, false, true ): return PBRTTVVT;
|
||||||
|
case GetPBRMod(false, false, true , false, true ): return PBRVVTVT;
|
||||||
|
case GetPBRMod(true , false, true , false, true ): return PBRTVTVT;
|
||||||
|
case GetPBRMod(false, true , true , false, true ): return PBRVTTVT;
|
||||||
|
case GetPBRMod(true , true , true , false, true ): return PBRTTTVT;
|
||||||
|
case GetPBRMod(false, false, false, true , true ): return PBRVVVTT;
|
||||||
|
case GetPBRMod(true , false, false, true , true ): return PBRTVVTT;
|
||||||
|
case GetPBRMod(false, true , false, true , true ): return PBRVTVTT;
|
||||||
|
case GetPBRMod(true , true , false, true , true ): return PBRTTVTT;
|
||||||
|
case GetPBRMod(false, false, true , true , true ): return PBRVVTTT;
|
||||||
|
case GetPBRMod(true , false, true , true , true ): return PBRTVTTT;
|
||||||
|
case GetPBRMod(false, true , true , true , true ): return PBRVTTTT;
|
||||||
|
case GetPBRMod(true , true , true , true , true ): return PBRTTTTT;
|
||||||
|
default: return None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,36 +483,53 @@ PIDToPBR(PipelineID pid)
|
|||||||
{
|
{
|
||||||
switch(pid) with(PID)
|
switch(pid) with(PID)
|
||||||
{
|
{
|
||||||
case PBRVVVV: return GetPBRMod(false, false, false, false);
|
case PBRVVVVV: return GetPBRMod(false, false, false, false, false);
|
||||||
case PBRTVVV: return GetPBRMod(true , false, false, false);
|
case PBRTVVVV: return GetPBRMod(true , false, false, false, false);
|
||||||
case PBRVTVV: return GetPBRMod(false, true , false, false);
|
case PBRVTVVV: return GetPBRMod(false, true , false, false, false);
|
||||||
case PBRVVTV: return GetPBRMod(false, false, true , false);
|
case PBRTTVVV: return GetPBRMod(true , true , false, false, false);
|
||||||
case PBRVVVT: return GetPBRMod(false, false, false, true );
|
case PBRVVTVV: return GetPBRMod(false, false, true , false, false);
|
||||||
case PBRTTVV: return GetPBRMod(true , true , false, false);
|
case PBRTVTVV: return GetPBRMod(true , false, true , false, false);
|
||||||
case PBRTVTV: return GetPBRMod(true , false, true , false);
|
case PBRVTTVV: return GetPBRMod(false, true , true , false, false);
|
||||||
case PBRTVVT: return GetPBRMod(true , false, false, true );
|
case PBRTTTVV: return GetPBRMod(true , true , true , false, false);
|
||||||
case PBRVTTV: return GetPBRMod(false, true , true , false);
|
case PBRVVVTV: return GetPBRMod(false, false, false, true , false);
|
||||||
case PBRVTVT: return GetPBRMod(false, true , false, true );
|
case PBRTVVTV: return GetPBRMod(true , false, false, true , false);
|
||||||
case PBRVVTT: return GetPBRMod(false, false, true , true );
|
case PBRVTVTV: return GetPBRMod(false, true , false, true , false);
|
||||||
case PBRTTTV: return GetPBRMod(true , true , true , false);
|
case PBRTTVTV: return GetPBRMod(true , true , false, true , false);
|
||||||
case PBRTTVT: return GetPBRMod(true , true , false, true );
|
case PBRVVTTV: return GetPBRMod(false, false, true , true , false);
|
||||||
case PBRTVTT: return GetPBRMod(true , false, true , true );
|
case PBRTVTTV: return GetPBRMod(true , false, true , true , false);
|
||||||
case PBRVTTT: return GetPBRMod(false, true , true , true );
|
case PBRVTTTV: return GetPBRMod(false, true , true , true , false);
|
||||||
case PBRTTTT: return GetPBRMod(true , true , true , true );
|
case PBRTTTTV: return GetPBRMod(true , true , true , true , false);
|
||||||
default: return 0;
|
case PBRVVVVT: return GetPBRMod(false, false, false, false, true );
|
||||||
|
case PBRTVVVT: return GetPBRMod(true , false, false, false, true );
|
||||||
|
case PBRVTVVT: return GetPBRMod(false, true , false, false, true );
|
||||||
|
case PBRTTVVT: return GetPBRMod(true , true , false, false, true );
|
||||||
|
case PBRVVTVT: return GetPBRMod(false, false, true , false, true );
|
||||||
|
case PBRTVTVT: return GetPBRMod(true , false, true , false, true );
|
||||||
|
case PBRVTTVT: return GetPBRMod(false, true , true , false, true );
|
||||||
|
case PBRTTTVT: return GetPBRMod(true , true , true , false, true );
|
||||||
|
case PBRVVVTT: return GetPBRMod(false, false, false, true , true );
|
||||||
|
case PBRTVVTT: return GetPBRMod(true , false, false, true , true );
|
||||||
|
case PBRVTVTT: return GetPBRMod(false, true , false, true , true );
|
||||||
|
case PBRTTVTT: return GetPBRMod(true , true , false, true , true );
|
||||||
|
case PBRVVTTT: return GetPBRMod(false, false, true , true , true );
|
||||||
|
case PBRTVTTT: return GetPBRMod(true , false, true , true , true );
|
||||||
|
case PBRVTTTT: return GetPBRMod(false, true , true , true , true );
|
||||||
|
case PBRTTTTT: return GetPBRMod(true , true , true , true , true );
|
||||||
|
default: return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32
|
static u32
|
||||||
GetPBRMod(bool albedo = false, bool ambient = false, bool specular = false, bool alpha = false)
|
GetPBRMod(bool albedo = false, bool normal = false, bool metal_rough = false, bool occlusion = false, bool emission = false)
|
||||||
{
|
{
|
||||||
with(PBRMod)
|
with(PBRMod)
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
(albedo ? AlbedoTexture : AlbedoValue) |
|
(albedo ? AlbedoTexture : None) |
|
||||||
(ambient ? AmbientTexture : AmbientValue) |
|
(normal ? NormalTexture : None) |
|
||||||
(specular ? SpecularTexture : SpecularValue) |
|
(metal_rough ? MetalRoughTexture : None) |
|
||||||
(alpha ? AlphaTexture : AlphaValue);
|
(occlusion ? OcclusionTexture : None) |
|
||||||
|
(emission ? EmissionTexture : None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,17 +1,38 @@
|
|||||||
// DEFINES
|
// TYPES
|
||||||
|
|
||||||
#define OIT_LAYERS 16
|
#define u32 uint
|
||||||
|
#define i32 int
|
||||||
|
#define b32 bool
|
||||||
|
#define f32 float
|
||||||
|
#define f64 double
|
||||||
|
|
||||||
#define IMG_MAX 100
|
// CONSTANTS
|
||||||
#define BUF_MAX 25
|
|
||||||
#define UNI_MAX 50
|
const u32 OIT_LAYERS = 16;
|
||||||
|
const u32 IMG_MAX = 100;
|
||||||
|
const u32 BUF_MAX = 25;
|
||||||
|
const u32 UNI_MAX = 50;
|
||||||
|
|
||||||
|
const u32 MAT_ALBEDO = 0;
|
||||||
|
const u32 MAT_NORMAL = 1;
|
||||||
|
const u32 MAT_METALLIC = 2;
|
||||||
|
const u32 MAT_ROUGHNESS = 3;
|
||||||
|
const u32 MAT_OCCLUSION = 4;
|
||||||
|
const u32 MAT_EMISSION = 5;
|
||||||
|
const u32 MAT_HEIGHT = 6;
|
||||||
|
const u32 MAT_CUBEMAP = 7;
|
||||||
|
const u32 MAT_IRRADIANCE = 8;
|
||||||
|
const u32 MAT_PREFILTER = 9;
|
||||||
|
const u32 MAT_BRDF = 10;
|
||||||
|
const u32 MAT_MAX = 11;
|
||||||
|
|
||||||
// SPEC CONSTANTS
|
// SPEC CONSTANTS
|
||||||
|
|
||||||
layout (constant_id = 0) const bool ALBEDO_TEX = false;
|
layout (constant_id = 0) const bool ALBEDO_TEX = false;
|
||||||
layout (constant_id = 1) const bool AMBIENT_TEX = false;
|
layout (constant_id = 1) const bool NORMAL_TEX = false;
|
||||||
layout (constant_id = 2) const bool SPECULAR_TEX = false;
|
layout (constant_id = 2) const bool METALLIC_ROUGHNESS_TEX = false;
|
||||||
layout (constant_id = 3) const bool ALPHA_TEX = false;
|
layout (constant_id = 3) const bool OCCLUSION_TEX = false;
|
||||||
|
layout (constant_id = 4) const bool EMISSION_TEX = false;
|
||||||
|
|
||||||
// SET 0
|
// SET 0
|
||||||
|
|
||||||
@ -34,16 +55,15 @@ layout (set = 1, binding = 2, r32ui) uniform coherent uimage2D ImageAux;
|
|||||||
// SET 2
|
// SET 2
|
||||||
|
|
||||||
layout (set = 2, binding = 0) uniform texture2D AlbedoTex;
|
layout (set = 2, binding = 0) uniform texture2D AlbedoTex;
|
||||||
layout (set = 2, binding = 1) uniform texture2D AmbientTex;
|
layout (set = 2, binding = 1) uniform texture2D NormalTex;
|
||||||
layout (set = 2, binding = 2) uniform texture2D SpecularTex;
|
layout (set = 2, binding = 2) uniform texture2D MRTex; // Metallic Roughness
|
||||||
layout (set = 2, binding = 3) uniform texture2D AlphaTex;
|
layout (set = 2, binding = 3) uniform texture2D OcclusionTex;
|
||||||
layout (set = 2, binding = 4) uniform MaterialData {
|
layout (set = 2, binding = 4) uniform texture2D EmissionTex;
|
||||||
vec4 ambient;
|
layout (set = 2, binding = 5) uniform MaterialData {
|
||||||
vec4 diffuse;
|
vec4 col;
|
||||||
vec4 specular;
|
u32 padding;
|
||||||
float shininess;
|
f32 value;
|
||||||
float alpha;
|
} Material[MAT_MAX];
|
||||||
} Material;
|
|
||||||
|
|
||||||
layout (set = 3, binding = 0) uniform ModelState {
|
layout (set = 3, binding = 0) uniform ModelState {
|
||||||
mat4 model_matrix;
|
mat4 model_matrix;
|
||||||
@ -52,19 +72,20 @@ layout (set = 3, binding = 0) uniform ModelState {
|
|||||||
// PUSH CONSTANTS
|
// PUSH CONSTANTS
|
||||||
|
|
||||||
layout (push_constant) uniform PushConstants {
|
layout (push_constant) uniform PushConstants {
|
||||||
uint t0;
|
u32 t0;
|
||||||
uint t1;
|
u32 t1;
|
||||||
uint t2;
|
u32 t2;
|
||||||
uint t3;
|
u32 t3;
|
||||||
uint m0;
|
u32 m0;
|
||||||
uint s0;
|
u32 s0;
|
||||||
} PC;
|
} PC;
|
||||||
|
|
||||||
// ALIAS MACROS
|
// ALIAS MACROS
|
||||||
|
|
||||||
#define ModelMatrix State.model_matrix
|
#define ModelMatrix State.model_matrix
|
||||||
#define ModelAmbient Material.ambient
|
#define Albedo Material[MAT_ALBEDO].col;
|
||||||
#define ModelDiffuse Material.diffuse
|
#define Metallic(uv) texture(sampler2D(MRTex, SamplerNearest), uv).b
|
||||||
#define ModelSpecular Material.specular
|
#define Roughness(uv) texture(sampler2D(MRTex, SamplerNearest), uv).g
|
||||||
#define ModelShininess Material.shininess
|
#define MetallicFactor Material[MAT_METALLIC].value
|
||||||
#define ModelAlpha Material.alpha
|
#define RoughnessFactor Material[MAT_ROUGHNESS].value
|
||||||
|
#define EmissiveFactor Material[MAT_EMISSION].value
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user