[vulkan] Avoid alias depth hack in shadow pass

This protects the view model from incorrect self-shadowing.
This commit is contained in:
Bill Currie 2023-08-03 09:55:53 +09:00
parent 19a5cb562c
commit 71934b15f4
2 changed files with 28 additions and 6 deletions

View file

@ -1310,7 +1310,7 @@ renderpasses = {
color = $color.alias;
tasks = (
{ func = alias_draw;
params = (0); },
params = (main, 0); },
);
stages = (
@ -1498,7 +1498,7 @@ renderpasses = {
color = $color.alias;
tasks = (
{ func = alias_draw;
params = (1); },
params = (main, 1); },
);
stages = (
@ -1948,7 +1948,7 @@ renderpasses = {
color = $color.alias;
tasks = (
{ func = alias_draw;
params = (0); },
params = (shadow, 0); },
);
stages = (

View file

@ -242,8 +242,8 @@ static void
alias_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
{
auto taskctx = (qfv_taskctx_t *) ectx;
bool vmod = Entity_Valid (vr_data.view_model);
int pass = *(int *) params[0]->value;
auto pass = *(int *) params[0]->value;
auto stage = *(int *) params[1]->value;
auto ctx = taskctx->ctx;
auto device = ctx->device;
@ -259,6 +259,8 @@ alias_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
layout, 0, shadow ? 1 : 2, sets, 0, 0);
bool vmod = !stage && Entity_Valid (vr_data.view_model);
auto queue = r_ent_queue; //FIXME fetch from scene
for (size_t i = 0; i < queue->ent_queues[mod_alias].size; i++) {
entity_t ent = queue->ent_queues[mod_alias].a[i];
@ -275,11 +277,31 @@ alias_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
}
}
static exprenum_t alias_stage_enum;
static exprtype_t alias_stage_type = {
.name = "alias_stage",
.size = sizeof (int),
.get_string = cexpr_enum_get_string,
.data = &alias_stage_enum,
};
static int alias_stage_values[] = { 0, 1, };
static exprsym_t alias_stage_symbols[] = {
{"main", &alias_stage_type, alias_stage_values + 0},
{"shadow", &alias_stage_type, alias_stage_values + 1},
{}
};
static exprtab_t alias_stage_symtab = { .symbols = alias_stage_symbols };
static exprenum_t alias_stage_enum = {
&alias_stage_type,
&alias_stage_symtab,
};
static exprtype_t *alias_draw_params[] = {
&cexpr_int,
&alias_stage_type,
};
static exprfunc_t alias_draw_func[] = {
{ .func = alias_draw, .num_params = 1, .param_types = alias_draw_params },
{ .func = alias_draw, .num_params = 2, .param_types = alias_draw_params },
{}
};
static exprsym_t alias_task_syms[] = {