SceneColor in a surface material ignores translucent objects behind it

Scene color should not contain translucent objects, if they are rendered in separate translucency pass.

(4.17 built from source updated 15 september)

After upgrading from 4.15 to 4.17 (didn’t try 4.16) the SceneColor material node when used in surface materials stopped considering translucent meshes and particles that are behind it. It just returns the color of opaque surfaces as if the translucent objects were not present.

To reproduce:

  • create a project form blueprint first person template
  • create a translucent unlit material
  • ---- connect to Emissive Color: SceneColor → Multiply(0.5) → EmissiveColor
  • ---- connect 1 to opacity
  • assign the material to one of the white cubes in the level
  • move the view so that the blue text on the floor (which is translucent) is behind the cube: the text is not visible through the cube

I also tried making the material lit and using Base Color instead of Emissive Color, but the result is the same.

I forgot to mention that separate translucency is disabled in my project.

However, I tried with separate translucent enabled and disabled, and enabling/disabling “Render After DOF” in materials, but I cannot find a combination that makes SceneColor consider translucent things. As I said, this was working in 4.15.

Hey matfer-

Thank you for submitting a bug report. I have reproduced this issue and logged a report for it here Unreal Engine Issues and Bug Tracker (UE-50204) . You can track the report’s status as the issue is reviewed by our development staff. Please be aware that this issue may not be prioritized or fixed soon.

Cheers

I noticed that the issue has been closed as “By Design” for optimization reasons. However, how can I get the scene color including translucent objects? It seems to me rather common for a translucent material to get the color behind it and do something with it, but ignoring part of the scene looks like a big limitation.

This is the only difference concerning SceneColor that I could find in MaterialExpressions.cpp:

@@ -6882,7 +7017,7 @@ FString UMaterialExpressionSceneColor::GetInputName(int32 InputIndex) const
 	{
 		// Display the current InputMode enum's display name.
 		UByteProperty* InputModeProperty = FindField<UByteProperty>( UMaterialExpressionSceneColor::StaticClass(), "InputMode" );
-		return InputModeProperty->Enum->GetEnumName((int32)InputMode.GetValue());
+		return InputModeProperty->Enum->GetNameStringByValue((int64)InputMode.GetValue());
 	}
 	return TEXT("");
 }

Does not seem relevant, I guess the change is deeper in the code.

Anyway, I will deal with the fact that SceneColor is no more the one it used to be. I hope some way to get the correct scene color will be implemented soon.

If you are using source, you can revert the changes to Scene Color in 4.17 by merging in the 4.15/4.16 implementation. Specifically I would look at the MaterilaExperssions.cpp file. Since this change was intentional, there is no expectation that this will return to how it used to work. It would be best to pull the 4.15 implementation into your project.

Epic, why you did this to me? Why you broke my work, just like that, for no reason? I want my blurry explosions back! I want my blurry trails back! I want my blurry shock waves back! What’s wrong with you Epic? Every current gen game has it! Why can’t I?
Weren’t you able to add a checkbox or something to make it backwards compatible? Cutting out really important features with no word about, and calling it “by design” backdated. That make no sense! Give me back my work!

OMG ! ! ! I need this to work again !

1 Like