Disable Eye Adaptation from Widgets Only?

My 3D Widgets are getting darker when i’m outside in lightened area… i want to keep the eye adaptation for rest of the stuff except 3D Widgets… So how can i disable it only for 3d widgets…??

I tried it in First Person Character Project… and its still effecting the widget! Steps i gone through are:-

  • Create new First Person Character Project
  • Create New widget blueprint and add a button and text inside it (button default, text pure white)
  • Fill canvas panel with button and set text size to 3000
  • In First person character BP… Add new widget component and set it to newly created widget
  • Move it in front of player > Draw size 2000x1000 scale 0.1 , 0.1 > rotate toward player
  • In post processing volume set Auto Exposure max brightness to 10
  • Change Light Source intensity to 500 (just to see the effect clearly)
  • At this point if you play the widget will appear darker, even white text wont look white…
  • But you can also create a shaded area in scene to see how eye adaptation makes the widget go bright again after going inside that darker area!

Hello ,

I have written up a feature request ( UE-18585) to allow users to have objects opt out of this feature. I have sent this report to the developers for further consideration. I will provide updates with any pertinent information as it becomes available. Thank you for your time and information.

Edit: Feature request was canceled see above answer

Make it a great day

FYI what you are asking for is not really possible so I have closed this request. You cannot disable select post process effects for select pixels on the screen nicely. Post Process affects the entire screen. Our plan is to allow 3D widgets to render after post process because it is unlikely you want any of the post effects to be applied to widgets. Please keep in mind that 3D widget drawing is experimental because we do not feel it is up to quality bar yet. This post processing issue is one of those reasons.

Also having this problem. I find it hard to believe that many people are not experiencing this too… The only way i could find to work around it was to

  1. turn the opacity way down on everything in your umg to about 0.2 (if your umg is translucent and against a black background). You could also turn the brightness down but that interferes with the colors.

  2. put a PostProcessing volume in when you are viewing your 3d umg. Set your Bloom to 0.05 or lower, and you can also mess with the Min/Max brightness and speed up values for Auto Exposure.

  3. setup a timeline to crank up the light intensity (of the lights in the backgroun) at a speed that matches the auto exposure adjustment. The way i have it setup, the background exposure doesn’t look like it changes, and the foreground 3d umg looks good.

Granted i no longer have a working Bloom for the lights in the background while viewing my monitor.

before:

after:

Thought i’d offer my workaround. Good luck!

This maybe an old thread but still relevant. Is there any news on making the 3D widgets render after the post process??

I had the same issue here and somehow managed to fix it.
My solution will only work with Single Viewport games (no split screen) but you could make it work quiet easily.

The thing is that the Exposure value is computed on the GPU side and the result is stored in a 1x1 texture. Then that texture is fed to the subsequent nodes in the PostProcess tree so the exposure correction can be applied to bloom, tonemapper etc

So I just locked that texture on the render thread as soon as it’s available, read the ExposureScale value and stored it to a global var. Then the value can be read from the game thread and applied to the ColorTint of the widgets.

Here’s the code :

In SceneRendering.h

  extern RENDERER_API float GfExposureScale;    

In PostProcessEyeAdaptation.cpp

// Exporting the computed ExposureScale value to a Global float var
float GfExposureScale = .0f;

void FRCPassPostProcessEyeAdaptation::Process(FRenderingCompositePassContext& Context)

{

    . . .

if (bIsComputePass)
{
    . . . 
}
else
	{
    . . .

// add this
         if(auto * Tex = DestRenderTarget.ShaderResourceTexture->GetTexture2D())
		{
		uint32 Stride;
		if(const float * fExposureResults = (float*)RHILockTexture2D(Tex, 0, EResourceLockMode::RLM_ReadOnly, Stride, false, false))
			GfExposureScale = fExposureResults[0];

			RHIUnlockTexture2D(Tex, 0, false);
    	}
// End of add

	// Inform MultiGPU systems that we've finished updating this texture for this frame
	Context.RHICmdList.EndUpdateMultiFrameResource(DestRenderTarget.ShaderResourceTexture);
	}

 . . .

 }

Now you have a global where you can get the exposure value. As long as you just READ it from the GameThread, you should be fine.

Now, in the Tick of your Widget, you should update its brightness using the TintColor or a MaterialParameter. I do like this :

MyWidget->SetTintColorAndOpacity(FLinearColor(1.f/GfExposureScale, 1.f/GfExposureScale, 1.f/GfExposureScale));

Done.

You’ll have to add “Renderer” to the PublicDependencyModuleNames in the build.cs of your module in order to make it link correctly.

2 Likes