diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-07-25 12:25:17 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2022-07-26 15:25:31 +0300 |
commit | 3b76778847ca83dc89859cad3673950c3d094f14 (patch) | |
tree | ba7af09ed5d90f8d9d1af646d6a85b48b8c3e686 | |
parent | 96d96e8909207c6e152e7fff4dcf3e0f2ef4a6d6 (diff) |
EEVEE-Next: Fix float3 passes being incorrect
-rw-r--r-- | source/blender/draw/engines/eevee_next/eevee_film.cc | 11 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee_next/eevee_film.hh | 17 |
2 files changed, 27 insertions, 1 deletions
diff --git a/source/blender/draw/engines/eevee_next/eevee_film.cc b/source/blender/draw/engines/eevee_next/eevee_film.cc index 18e0452da25..49f43265aa8 100644 --- a/source/blender/draw/engines/eevee_next/eevee_film.cc +++ b/source/blender/draw/engines/eevee_next/eevee_film.cc @@ -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; } /** \} */ diff --git a/source/blender/draw/engines/eevee_next/eevee_film.hh b/source/blender/draw/engines/eevee_next/eevee_film.hh index 124fd79a1c0..1165b9a4c12 100644 --- a/source/blender/draw/engines/eevee_next/eevee_film.hh +++ b/source/blender/draw/engines/eevee_next/eevee_film.hh @@ -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 { |