Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2022-08-31 21:09:12 +0300
committerBrecht Van Lommel <brecht@blender.org>2022-08-31 21:51:50 +0300
commit3a605b23d02263be6bca9046e20b46a60832d971 (patch)
treeda54e85795fa142b43ed692b26d30e9322f1f927 /intern
parentb9998541e193b1f30728fc034c7a10daae183a08 (diff)
Fix T100708: Cycles bake of diffuse/glossy color not outputting alpha
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/integrator/pass_accessor.cpp6
-rw-r--r--intern/cycles/kernel/film/read.h15
-rw-r--r--intern/cycles/kernel/integrator/init_from_bake.h2
3 files changed, 22 insertions, 1 deletions
diff --git a/intern/cycles/integrator/pass_accessor.cpp b/intern/cycles/integrator/pass_accessor.cpp
index 05318b7545b..ab056e953c2 100644
--- a/intern/cycles/integrator/pass_accessor.cpp
+++ b/intern/cycles/integrator/pass_accessor.cpp
@@ -191,6 +191,12 @@ bool PassAccessor::get_render_tile_pixels(const RenderBuffers *render_buffers,
* had the computation done. */
if (pass_info.num_components == 3) {
get_pass_float3(render_buffers, buffer_params, destination);
+
+ /* Use alpha for colors passes. */
+ if (type == PASS_DIFFUSE_COLOR || type == PASS_GLOSSY_COLOR ||
+ type == PASS_TRANSMISSION_COLOR) {
+ num_written_components = destination.num_components;
+ }
}
else if (pass_info.num_components == 4) {
if (destination.num_components == 3) {
diff --git a/intern/cycles/kernel/film/read.h b/intern/cycles/kernel/film/read.h
index a0236909f4b..995c20a0053 100644
--- a/intern/cycles/kernel/film/read.h
+++ b/intern/cycles/kernel/film/read.h
@@ -235,6 +235,21 @@ ccl_device_inline void film_get_pass_pixel_float3(ccl_global const KernelFilmCon
pixel[0] = f.x;
pixel[1] = f.y;
pixel[2] = f.z;
+
+ /* Optional alpha channel. */
+ if (kfilm_convert->num_components >= 4) {
+ if (kfilm_convert->pass_combined != PASS_UNUSED) {
+ float scale, scale_exposure;
+ film_get_scale_and_scale_exposure(kfilm_convert, buffer, &scale, &scale_exposure);
+
+ ccl_global const float *in_combined = buffer + kfilm_convert->pass_combined;
+ const float alpha = in_combined[3] * scale;
+ pixel[3] = film_transparency_to_alpha(alpha);
+ }
+ else {
+ pixel[3] = 1.0f;
+ }
+ }
}
/* --------------------------------------------------------------------
diff --git a/intern/cycles/kernel/integrator/init_from_bake.h b/intern/cycles/kernel/integrator/init_from_bake.h
index dd26215bcd2..c77fc2540c1 100644
--- a/intern/cycles/kernel/integrator/init_from_bake.h
+++ b/intern/cycles/kernel/integrator/init_from_bake.h
@@ -113,7 +113,7 @@ ccl_device bool integrator_init_from_bake(KernelGlobals kg,
if (prim == -1) {
/* Accumulate transparency for empty pixels. */
kernel_accum_transparent(kg, state, 0, 1.0f, buffer);
- return false;
+ return true;
}
prim += kernel_data.bake.tri_offset;