EEVEE-Next: Fix float3 passes being incorrect

This commit is contained in:
Clément Foucault
2022-07-25 11:25:17 +02:00
parent f814871e81
commit c5394f3db8
2 changed files with 27 additions and 1 deletions

View File

@@ -620,7 +620,16 @@ float *Film::read_pass(eViewLayerEEVEEPassType pass_type)
GPU_memory_barrier(GPU_BARRIER_TEXTURE_UPDATE);
return (float *)GPU_texture_read(pass_tx, GPU_DATA_FLOAT, 0);
float *result = (float *)GPU_texture_read(pass_tx, GPU_DATA_FLOAT, 0);
if (pass_is_float3(pass_type)) {
/* Convert result in place as we cannot do this conversion on GPU. */
for (auto px : IndexRange(accum_tx.width() * accum_tx.height())) {
*(reinterpret_cast<float3 *>(result) + px) = *(reinterpret_cast<float3 *>(result + px * 4));
}
}
return result;
}
/** \} */

View File

@@ -109,6 +109,23 @@ class Film {
}
}
static bool pass_is_float3(eViewLayerEEVEEPassType pass_type)
{
switch (pass_type) {
case EEVEE_RENDER_PASS_NORMAL:
case EEVEE_RENDER_PASS_DIFFUSE_LIGHT:
case EEVEE_RENDER_PASS_DIFFUSE_COLOR:
case EEVEE_RENDER_PASS_SPECULAR_LIGHT:
case EEVEE_RENDER_PASS_SPECULAR_COLOR:
case EEVEE_RENDER_PASS_VOLUME_LIGHT:
case EEVEE_RENDER_PASS_EMIT:
case EEVEE_RENDER_PASS_ENVIRONMENT:
return true;
default:
return false;
}
}
/* Returns layer offset in the accumulation texture. -1 if the pass is not enabled. */
int pass_id_get(eViewLayerEEVEEPassType pass_type) const
{