Jump to content

Recovering whites or Making whites a bit whiter


dominikmateasik
 Share

Recommended Posts

Hi guys

i tried many approaches already but none of them is satisfactory enough, so i thought i would ask you how you go about this

 

important--all of this using linear workflow ,32bit exr, and not using white beyond 180 RGB

 

Your average interior scene-shooting against a window/windows, trying to lit up your scene with natural light as much as possible (HDRI,VraySky,Sun), pushing the camera in a way to receive the most amount of light possible,now getting highlight burns, and then getting rid of them using tonemapping still in 3d(vray frame buffer highlight burn option etc) or doing it in post(Photoshop-camera raw/masking, After Effects-hdr highlight compression/masking, Magic bullet-shoulder/crush/..., ArionFX-reinhard)--now you have your highlights tonemapped but the problem appears -- it took out lots of your other whites as well,making the picture(whites) all greyish without depth and detail(reinhardish washed out look) and now you have to find a way to raise those lost whites to be more white(less grey) again - how do you achieve the best results,whats your workflow usually,what have you find to be the most efficient solution for you,and what programs do you use for it (PS-curves or "whites" in camera raw,AF-curves or --is there sth like whites in PS camera raw(?),MagicBullet,Arion,VFB+)

 

I know that masking the highligths might be the "best" solution by changing only the burnt areas but lot of times its hard to isolate them since there might be already other objects involved and its quite time inefficient when having to tonemapp multiple images, this is why i created this thread in Vray section as the most efficient way would be doing it still in 3d using frame buffer or plugins like VFB+ or some other way

 

Thanks for taking the time and sorry for the long explanation

Edited by dominikmateasik
Link to comment
Share on other sites

I might be overthinking it,that one is true. About 180RGB,well it seems thats a "rule" for getting closer to physically correct shading but of course there is no rule...kind of

I always welcome any knowledge on the dynamic range you mentioned so go on if interested- i for sure am.

Curves might seem as the most straightforward approach so far,doable still in 3d, thanks for the advice,appreciated.

Link to comment
Share on other sites

well it seems thats a "rule" for getting closer to physically correct shading but of course there is no rule...kind of.

 

nope. no rule at all when it comes to vray other than trying to stay away from pure black or pure white. There's so much going on behind the curtain with cutting corners and importance sampling, that it doesn't pay to be legalistic about such things. In the old days when GI was all based on pure math and ideal diffuse conditions, an RGB value of 180 approximated 70% reflectance surfaces. In lighting design, ceilings are generally 80 percent, walls at 60 and floors at 20 so that 70 percent probably came about from averaging the generally accepted rules of thumb from architecture.

These are just pretty pictures so curves, levels and exposure adjustments are usually a far better use of your time.

Link to comment
Share on other sites

Agreed with John, there's a current trend to shy well away from white, but this seems to me to stem from the days when making something pure white, and then adding reflection (or other stuff) would break the rules of physics/thermodynamics by allowing an object to emit more light than it receives. This is all taken care of within render engines these days - just avoid pure white, and pure black as john said, but this is only precautionary and likely wouldn't cause you any issues at all.

Link to comment
Share on other sites

I agree with Chris and John well said.

Also you need to consider that Reinhard is doing what it supposed to, it is not a perfect solution, but so far is one of the solutions that help us to deal to get a color mapping that kind of Match what our eyes sees.

Think about it, If your scene was a real photography, the photographer will try to eliminate all those over bright areas some way some how, covering windows, using shades, or using fill lights to neutralize the over all illumination , He also he would take several exposures that later on he will combine in Photoshop, doing exactly what you re doing, masking, adjusting, curving etc etc.

 

The only color mapping I feel give us control of what we would like to is Cinematic color mapping, but this it was created as script for NUKE or Fusion. But even with that you need to render full float and adjust as need it.

Link to comment
Share on other sites

Thanks Chris,John and Francisco. I was curious whats your opinion/ideal workflow and i have to say i agree with you, especially with the no pure whites or blacks or the point of a photographer doing the same thing- yes very true, basically i was and will be doing it the way all of you described and thanks for your opinions.

Yep NUKE seems to have the most control over the subtleties i have seen so far with Cinematic, i might try that one as well,see what it does or doesnt.

Link to comment
Share on other sites

If you are asking me, :p

where I work we try to keep it within Photoshop, rendering out Reinhard but not pushing too much, about 0.5 or so, then using camera RAW in photoshop to do a first pass while still in 32 bits, I just pull down over bright a little and extreme black. making it more even.

Then transform to 16 bits and do the rest there.

 

Needless to say I never like it how Photoshop manage 32 bits images. When you open it in camera RAW they just look awful.

Since I discovered the cinematic color mapping and if I have the option, I will go to Fusion first and try to get the image there. Sometimes for limitation or my lack of know how in Fusion, I take the first stab there then output a 16 bits image and finish it in Photoshop.

 

If it is animation I go to Fusion first then output a DNxHD and finish in Premiere or After Effects.

 

The few times that I worked for some video project, video cameras output is pretty flat actually, with 16 bits depth or more depending. So now when I setup my scene in Max I try to match that output, flat looking image, but with enough range to accentuate brights and dark later in post.

Link to comment
Share on other sites

Thank you francisco for your insight,i have tried Nuke instead of fusion and found it really amazing especially with the controls in filmic tonemapping,lots of flexibility and Nuke is pretty subtle in selecting the parts you need to be editing automatically, the only downside is the price and need of another software in pipeline. Magicbullet Looks or Photolooks seems the most promising atm, its shoulder and curves capability seems so naturall and flexible at the same time, zeroing in the right areas to boost the whites (or anything else) automatically. From my understanding the development for Photolooks (in PS) ends so that leaves me with Looks in AF or get familiar in saving as 16bit and going to PS with it with tonemapped highligts.

 

What about the rest of you guys, whats your weapon of choice?

Link to comment
Share on other sites

Yes Dominik is correct, my memory failed when I was typing my answer.

Some one actually transferred that tone mapping from Nuke to fusion as a macro.

You have to download that macro and it will work just like regular node. As I type this I am looking for were I did download the first time but I can't find it.

I'll see if I can grab it from Fusion and post it here.

Link to comment
Share on other sites

Here goes:

This is the original translation to FUSION only.

 

Filmic tonemap operator is based on John Hable's work for Unchartered 2: http://filmicgames.com/archives/75

 

Copyright 2013 Martin Geupel

Thanks goes to Simon Lundberg for the respective Nuke Gizmo!

Feel free to re-use, adapt, distribute and change tool to suit your needs, but please don't sell it.

 

{
Tools = ordered() {
	FilmicTonemapping1 = MacroOperator {
		CtrlWZoom = false,
		NameSet = true,
		Inputs = ordered() {
			Comments = Input { Value = "Filmic tonemap operator is based on John Hable's work for Unchartered 2:  http://filmicgames.com/archives/75\r\n\r\nCopyright 2013 Martin Geupel\r\nThanks goes to Simon Lundberg for the respective Nuke Gizmo!\r\nFeel free to re-use, adapt, distribute and change tool to suit your needs, but please don't sell it.", },
			MainInput1 = InstanceInput {
				SourceOp = "FilmicTonemapping",
				Source = "Image1",
			},
			Input1 = InstanceInput {
				SourceOp = "FilmicTonemapping",
				Source = "NumberIn1",
			},
			Input2 = InstanceInput {
				SourceOp = "FilmicTonemapping",
				Source = "NumberIn2",
			},
			Input3 = InstanceInput {
				SourceOp = "FilmicTonemapping",
				Source = "NumberIn3",
			},
			Input4 = InstanceInput {
				SourceOp = "FilmicTonemapping",
				Source = "NumberIn4",
			},
			Input5 = InstanceInput {
				SourceOp = "FilmicTonemapping",
				Source = "NumberIn5",
			},
			Input6 = InstanceInput {
				SourceOp = "FilmicTonemapping",
				Source = "NumberIn6",
			},
			Input7 = InstanceInput {
				SourceOp = "FilmicTonemapping",
				Source = "NumberIn7",
				MaxScale = 20,
			},
		},
		Outputs = {
			MainOutput1 = InstanceOutput {
				SourceOp = "FilmicTonemapping",
				Source = "Output",
			},
		},
		ViewInfo = GroupInfo { Pos = { 819, 217, }, },
		Tools = ordered() {
			FilmicTonemapping = Custom {
				CtrlWZoom = false,
				CtrlWShown = false,
				NameSet = true,
				Inputs = {
					NumberIn1 = Input { Value = 0.22, },
					NumberIn2 = Input { Value = 0.3, },
					NumberIn3 = Input { Value = 0.1, },
					NumberIn4 = Input { Value = 0.2, },
					NumberIn5 = Input { Value = 0.01, },
					NumberIn6 = Input { Value = 0.3, },
					NumberIn7 = Input { Value = 11.2, },
					LUTIn1 = Input {
						SourceOp = "FilmicTonemappingLUTIn1",
						Source = "Value",
					},
					LUTIn2 = Input {
						SourceOp = "FilmicTonemappingLUTIn2",
						Source = "Value",
					},
					LUTIn3 = Input {
						SourceOp = "FilmicTonemappingLUTIn3",
						Source = "Value",
					},
					LUTIn4 = Input {
						SourceOp = "FilmicTonemappingLUTIn4",
						Source = "Value",
					},
					Setup1 = Input { Value = "n5/n6", },
					Setup2 = Input { Value = "n4*n6", },
					Setup3 = Input { Value = "n4*n5", },
					Setup4 = Input { Value = "n3*n2", },
					Intermediate1 = Input { Value = "( ( (n7*(n2*n7+s4)+s3) / (n7*(n1*n7+n2)+s2) ) - s1) ", },
					RedExpression = Input { Value = "( ( (r1*(n2*r1+s4)+s3) / (r1*(n1*r1+n2)+s2) ) - s1) *i1", },
					GreenExpression = Input { Value = "( ( (g1*(n2*g1+s4)+s3) / (g1*(n1*g1+n2)+s2) ) - s1) *i1", },
					BlueExpression = Input { Value = "( ( (b1*(n2*b1+s4)+s3) / (b1*(n1*b1+n2)+s2) ) - s1) *i1", },
					NumberControls = Input { Value = 1, },
					NameforNumber1 = Input { Value = "Shoulder Str.", },
					NameforNumber2 = Input { Value = "Linear Str.", },
					NameforNumber3 = Input { Value = "Linear Angle", },
					NameforNumber4 = Input { Value = "Toe Str.", },
					NameforNumber5 = Input { Value = "Toe Num.", },
					NameforNumber6 = Input { Value = "Toe Denum.", },
					NameforNumber7 = Input { Value = "White Point", },
					ShowNumber8 = Input { Value = 0, },
					ShowPoint1 = Input { Value = 0, },
					ShowPoint2 = Input { Value = 0, },
					ShowPoint3 = Input { Value = 0, },
					ShowPoint4 = Input { Value = 0, },
					ShowLUT1 = Input { Value = 0, },
					ShowLUT2 = Input { Value = 0, },
					ShowLUT3 = Input { Value = 0, },
					ShowLUT4 = Input { Value = 0, },
					Comments = Input { Value = "Filmic tonemap operator is based on John Hable's work for Unchartered 2:  http://filmicgames.com/archives/75\r\n\r\nCopyright 2013 Martin Geupel\r\nThanks goes to Simon Lundberg for the respective Nuke Gizmo!\r\nFeel free to re-use, adapt, distribute and change tool to suit your needs, but please don't sell it.", },
				},
				ViewInfo = OperatorInfo { Pos = { 0, 10.15, }, },
			},
			FilmicTonemappingLUTIn1 = LUTBezier {
				KeyColorSplines = {
					[0] = {
						[0] = { 0, RH = { 0.333333333333333, 0.333333333333333, }, Flags = { Linear = true, }, },
						[1] = { 1, LH = { 0.666666666666667, 0.666666666666667, }, Flags = { Linear = true, }, },
					},
				},
				SplineColor = { Red = 204, Green = 0, Blue = 0, },
				CtrlWShown = false,
			},
			FilmicTonemappingLUTIn2 = LUTBezier {
				KeyColorSplines = {
					[0] = {
						[0] = { 0, RH = { 0.333333333333333, 0.333333333333333, }, Flags = { Linear = true, }, },
						[1] = { 1, LH = { 0.666666666666667, 0.666666666666667, }, Flags = { Linear = true, }, },
					},
				},
				SplineColor = { Red = 0, Green = 204, Blue = 0, },
				CtrlWShown = false,
			},
			FilmicTonemappingLUTIn3 = LUTBezier {
				KeyColorSplines = {
					[0] = {
						[0] = { 0, RH = { 0.333333333333333, 0.333333333333333, }, Flags = { Linear = true, }, },
						[1] = { 1, LH = { 0.666666666666667, 0.666666666666667, }, Flags = { Linear = true, }, },
					},
				},
				SplineColor = { Red = 0, Green = 0, Blue = 204, },
				CtrlWShown = false,
			},
			FilmicTonemappingLUTIn4 = LUTBezier {
				KeyColorSplines = {
					[0] = {
						[0] = { 0, RH = { 0.333333333333333, 0.333333333333333, }, Flags = { Linear = true, }, },
						[1] = { 1, LH = { 0.666666666666667, 0.666666666666667, }, Flags = { Linear = true, }, },
					},
				},
				SplineColor = { Red = 204, Green = 204, Blue = 204, },
				CtrlWShown = false,
			},
		},
	},
	FilmicTonemappingLUTIn1 = LUTBezier {
		KeyColorSplines = {
			[0] = {
				[0] = { 0, RH = { 0.333333333333333, 0.333333333333333, }, Flags = { Linear = true, }, },
				[1] = { 1, LH = { 0.666666666666667, 0.666666666666667, }, Flags = { Linear = true, }, },
			},
		},
		SplineColor = { Red = 204, Green = 0, Blue = 0, },
		CtrlWShown = false,
	},
	FilmicTonemappingLUTIn2 = LUTBezier {
		KeyColorSplines = {
			[0] = {
				[0] = { 0, RH = { 0.333333333333333, 0.333333333333333, }, Flags = { Linear = true, }, },
				[1] = { 1, LH = { 0.666666666666667, 0.666666666666667, }, Flags = { Linear = true, }, },
			},
		},
		SplineColor = { Red = 0, Green = 204, Blue = 0, },
		CtrlWShown = false,
	},
	FilmicTonemappingLUTIn3 = LUTBezier {
		KeyColorSplines = {
			[0] = {
				[0] = { 0, RH = { 0.333333333333333, 0.333333333333333, }, Flags = { Linear = true, }, },
				[1] = { 1, LH = { 0.666666666666667, 0.666666666666667, }, Flags = { Linear = true, }, },
			},
		},
		SplineColor = { Red = 0, Green = 0, Blue = 204, },
		CtrlWShown = false,
	},
	FilmicTonemappingLUTIn4 = LUTBezier {
		KeyColorSplines = {
			[0] = {
				[0] = { 0, RH = { 0.333333333333333, 0.333333333333333, }, Flags = { Linear = true, }, },
				[1] = { 1, LH = { 0.666666666666667, 0.666666666666667, }, Flags = { Linear = true, }, },
			},
		},
		SplineColor = { Red = 204, Green = 204, Blue = 204, },
		CtrlWShown = false,
	},
},
}

Link to comment
Share on other sites

Nice one thanks, and Fusion is free so anybody can use it, havent tried it yet but expecting the same as Nuke,very fine tonemapping capabilities (and i guess much more), the node based system is much more likeable than the layered ones IMO too. But the truth stays, easiest go-to approach for most users is still gonna be the photoshop as Chris mentioned-it can do anything (with little bit of tweaking), maybe not the most automated one though(?)

Link to comment
Share on other sites

Filmic mapping doesn't protect from flatness in highlights (it's after all, still highlight compression curve), but to retain better saturation (esp. of blacks) and overall contrast (by keeping small toe on curve in blacks part).

 

It's far superior to Reinhard, but doesn't do miracles. How good something looks still depends on artist's lighting skill. And post-production.

 

With the original controls, it's almost unusable, as mentioned by NIC (too many). VFB+ has simplified the control to pure highlight compression and rich blacks.

 

It's perfectly acceptable to use higher albedo for material than its real-world counter-part, I also do it, because it creates artistically easier way to light interior. If it suites me, I use 220, no big deal. But if you go higher than 180 +/-, let's keep this value (it's arbitrary, could be 150, or anything else), you loose a lot of local contrast, there will be more lightbounce than happens in reality and it makes sampling harder for any raytracer. Renderer will still compute physically correct result for its given input (energy preserving), but it simply won't mimmick our reality, because such material doesn't exist in first place. Physically correct, and physically plausible have still different meaning here.

 

These values were not made up from average luminance/reflection values, but measured directly on materials. You can do so by yourself on MERL database using any common BRDF explorer.

 

 

But I agree with above guys about over-thinking. It really is about good lighting and good post-production as long as the scene isn't setup completely abysmally. Requires good eye rather than magical plugin (Arion or whatever, I use nothing personally, pure good old curves).

Edited by RyderSK
Link to comment
Share on other sites

somehow my previous comment got lost so again:

 

hey juro,thanks for spilling some knowledge and your approach

 

its nice to see getting out of "boundaries" is a normal thing to do,at the end the final picture is the king.

overthinking has become an annoying issue of mine lately,that i must admit. and yes i gotto agree there sipmly isnt magical plugin to solve the issues i was more curious about the workflows of you guys with possible outcome of finding the most efficiently-sufficient way to tackle this. and so i did and im really glad to see that not overcomplicating this and sticking to basics like photoshop which is as good as any other softwares, is the usual way, its for me the best outcome there could be

 

btw, regarding whites, i stumbled upon your project Wythe Lane Townhouses-the interior shots especially the one with the blue leathered couch, i was curious how you managed to create such a (almost) homogenic white across the walls ,upping the rgb in 3d(like mentioned above), very smart use of fill lights(to make the spread of light very even) or was it a postwork(using curves or maybe masking them to separate it from the other objects and then manipulating), the contrast is very nice there and as a whole really fine project.

 

thanks again for stopping by and sharing, always a pleasure

Link to comment
Share on other sites

Go out and take some RAW photos with a DSLR or P+S with the capabilities, and view their output. This is the look that I target with my renderer output, then save to exr format. This is for instances where I really want control over the tones of the final output.

 

For a lot of work, I have simply been using the controls built into the corona framebuffer to rescue quick renderings, saves a lot of troubleshooting for occasions when I don't need perfect results.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...