Skip to content

Commit 1e064a1

Browse files
tcauchoispixar-oss
authored andcommitted
[hdSt] Add support for camera exposure compensation.
Camera exposure is represented as a scalar multiplier on incoming radiance ("linear exposure scale"), calculated from an exponential "exposure" adjustment as well as potentially fStop/iso/etc in the case of UsdGeomCamera. This change adds Storm support for exposure compensation, by multiplying the result of "surfaceShader" calls (calculating lit and shaded 3d pixels) by the exposure factor. Note that exposure compensation is not applied to some other sources of color like "repr" color or selection highlight colors, which are considered non-physical colors. Since exposure is only applied to the rendering process, exposure compensation of framebuffer contents that will be composited with hydra needs to be done as a separate process. (Internal change: 2371431)
1 parent 871ce58 commit 1e064a1

31 files changed

+889
-0
lines changed

pxr/imaging/hd/renderPassState.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ HdRenderPassState::HdRenderPassState()
2626
, _pointSize(3.0)
2727
, _lightingEnabled(true)
2828
, _clippingEnabled(true)
29+
, _enableExposureCompensation(true)
2930

3031
, _maskColor(1.0f, 0.0f, 0.0f, 1.0f)
3132
, _indicatorColor(0.0f, 1.0f, 0.0f, 1.0f)
@@ -282,6 +283,12 @@ HdRenderPassState::SetClippingEnabled(bool enabled)
282283
_clippingEnabled = enabled;
283284
}
284285

286+
void
287+
HdRenderPassState::SetEnableExposureCompensation(bool enabled)
288+
{
289+
_enableExposureCompensation = enabled;
290+
}
291+
285292
void
286293
HdRenderPassState::SetAovBindings(
287294
HdRenderPassAovBindingVector const& aovBindings)

pxr/imaging/hd/renderPassState.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ class HdRenderPassState
192192
void SetClippingEnabled(bool enabled);
193193
bool GetClippingEnabled() const { return _clippingEnabled; }
194194

195+
HD_API
196+
void SetEnableExposureCompensation(bool enableExposureCompensation);
197+
bool GetEnableExposureCompensation() const { return _enableExposureCompensation; }
198+
195199
// ---------------------------------------------------------------------- //
196200
/// \name Render pipeline state
197201
// ---------------------------------------------------------------------- //
@@ -357,6 +361,7 @@ class HdRenderPassState
357361
float _pointSize;
358362
bool _lightingEnabled;
359363
bool _clippingEnabled;
364+
bool _enableExposureCompensation;
360365

361366
GfVec4f _maskColor;
362367
GfVec4f _indicatorColor;

pxr/imaging/hd/tokens.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ PXR_NAMESPACE_OPEN_SCOPE
207207
(cullStyle) \
208208
(drawRange) \
209209
(environmentMap) \
210+
(linearExposure) \
210211
(displacementShader) \
211212
(fragmentShader) \
212213
(geometryShader) \
@@ -435,6 +436,7 @@ TfToken HdAovTokensMakeShader(TfToken const& shader);
435436
(enableShadows) \
436437
(enableSceneMaterials) \
437438
(enableSceneLights) \
439+
(enableExposureCompensation) \
438440
(domeLightCameraVisibility) \
439441
/* Raytracer sampling settings */ \
440442
(convergedVariance) \

pxr/imaging/hdSt/renderDelegate.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ HdStRenderDelegate::HdStRenderDelegate(HdRenderSettingsMap const& settingsMap)
205205
HdRenderSettingDescriptor{
206206
"Dome light camera visibility",
207207
HdRenderSettingsTokens->domeLightCameraVisibility,
208+
VtValue(true) },
209+
HdRenderSettingDescriptor{
210+
"Enable exposure compensation",
211+
HdRenderSettingsTokens->enableExposureCompensation,
208212
VtValue(true) }
209213
};
210214

pxr/imaging/hdSt/renderPassState.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,9 @@ HdStRenderPassState::Prepare(
305305
bufferSpecs.emplace_back(
306306
HdShaderTokens->lightingBlendAmount,
307307
HdTupleType{HdTypeFloat, 1});
308+
bufferSpecs.emplace_back(
309+
HdShaderTokens->linearExposure,
310+
HdTupleType{HdTypeFloat, 1});
308311
bufferSpecs.emplace_back(
309312
HdShaderTokens->stepSize,
310313
HdTupleType{HdTypeFloat, 1});
@@ -361,6 +364,11 @@ HdStRenderPassState::Prepare(
361364
// only using the feature to turn lighting on and off.
362365
float lightingBlendAmount = (_lightingEnabled ? 1.0f : 0.0f);
363366

367+
// Camera exposure (linear-encoded)
368+
float linearExposure =
369+
((_camera && _enableExposureCompensation)
370+
? _camera->GetLinearExposureScale() : 1.0f);
371+
364372
GfMatrix4d const& worldToViewMatrix = GetWorldToViewMatrix();
365373
GfMatrix4d projMatrix = GetProjectionMatrix();
366374

@@ -426,6 +434,9 @@ HdStRenderPassState::Prepare(
426434
std::make_shared<HdVtBufferSource>(
427435
HdShaderTokens->lightingBlendAmount,
428436
VtValue(lightingBlendAmount)),
437+
std::make_shared<HdVtBufferSource>(
438+
HdShaderTokens->linearExposure,
439+
VtValue(linearExposure)),
429440
std::make_shared<HdVtBufferSource>(
430441
HdShaderTokens->stepSize,
431442
VtValue(_stepSize)),

pxr/imaging/hdSt/shaders/renderPass.glslfx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ float GetLightingBlendAmount() {
6666
return 1;
6767
#endif
6868
}
69+
float GetLinearExposure() {
70+
#if defined(HD_HAS_linearExposure)
71+
return HdGet_linearExposure();
72+
#else
73+
return 1;
74+
#endif
75+
}
6976
vec4 GetViewport() {
7077
#if defined(HD_HAS_viewport)
7178
return HdGet_viewport();

pxr/imaging/hdSt/shaders/terminals.glslfx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ vec4 ShadingTerminal(vec4 Peye, vec3 Neye, vec4 color, vec4 patchCoord)
100100
Neye,
101101
shadingColor);
102102
#endif
103+
104+
// Modify the shaded color by camera exposure.
105+
shadingColor.rgb *= GetLinearExposure();
103106

104107
reprColor.rgb = reprStyle.useSurfaceShaderColor ?
105108
shadingColor.rgb :

pxr/imaging/hdSt/testenv/testHdStCodeGen_GL/baseline/codegen_curves_indirect.out

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,13 @@ float GetLightingBlendAmount() {
316316
return 1;
317317
#endif
318318
}
319+
float GetLinearExposure() {
320+
#if defined(HD_HAS_linearExposure)
321+
return HdGet_linearExposure();
322+
#else
323+
return 1;
324+
#endif
325+
}
319326
vec4 GetViewport() {
320327
#if defined(HD_HAS_viewport)
321328
return HdGet_viewport();
@@ -1024,6 +1031,13 @@ float GetLightingBlendAmount() {
10241031
return 1;
10251032
#endif
10261033
}
1034+
float GetLinearExposure() {
1035+
#if defined(HD_HAS_linearExposure)
1036+
return HdGet_linearExposure();
1037+
#else
1038+
return 1;
1039+
#endif
1040+
}
10271041
vec4 GetViewport() {
10281042
#if defined(HD_HAS_viewport)
10291043
return HdGet_viewport();
@@ -1597,6 +1611,13 @@ float GetLightingBlendAmount() {
15971611
return 1;
15981612
#endif
15991613
}
1614+
float GetLinearExposure() {
1615+
#if defined(HD_HAS_linearExposure)
1616+
return HdGet_linearExposure();
1617+
#else
1618+
return 1;
1619+
#endif
1620+
}
16001621
vec4 GetViewport() {
16011622
#if defined(HD_HAS_viewport)
16021623
return HdGet_viewport();
@@ -2345,6 +2366,13 @@ float GetLightingBlendAmount() {
23452366
return 1;
23462367
#endif
23472368
}
2369+
float GetLinearExposure() {
2370+
#if defined(HD_HAS_linearExposure)
2371+
return HdGet_linearExposure();
2372+
#else
2373+
return 1;
2374+
#endif
2375+
}
23482376
vec4 GetViewport() {
23492377
#if defined(HD_HAS_viewport)
23502378
return HdGet_viewport();
@@ -2632,6 +2660,9 @@ vec4 ShadingTerminal(vec4 Peye, vec3 Neye, vec4 color, vec4 patchCoord)
26322660
shadingColor);
26332661
#endif
26342662

2663+
// Modify the shaded color by camera exposure.
2664+
shadingColor.rgb *= GetLinearExposure();
2665+
26352666
reprColor.rgb = reprStyle.useSurfaceShaderColor ?
26362667
shadingColor.rgb :
26372668
reprColor.rgb;

pxr/imaging/hdSt/testenv/testHdStCodeGen_GL/baseline/codegen_mesh_edgeonly.out

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,13 @@ float GetLightingBlendAmount() {
317317
return 1;
318318
#endif
319319
}
320+
float GetLinearExposure() {
321+
#if defined(HD_HAS_linearExposure)
322+
return HdGet_linearExposure();
323+
#else
324+
return 1;
325+
#endif
326+
}
320327
vec4 GetViewport() {
321328
#if defined(HD_HAS_viewport)
322329
return HdGet_viewport();
@@ -1083,6 +1090,13 @@ float GetLightingBlendAmount() {
10831090
return 1;
10841091
#endif
10851092
}
1093+
float GetLinearExposure() {
1094+
#if defined(HD_HAS_linearExposure)
1095+
return HdGet_linearExposure();
1096+
#else
1097+
return 1;
1098+
#endif
1099+
}
10861100
vec4 GetViewport() {
10871101
#if defined(HD_HAS_viewport)
10881102
return HdGet_viewport();
@@ -1846,6 +1860,13 @@ float GetLightingBlendAmount() {
18461860
return 1;
18471861
#endif
18481862
}
1863+
float GetLinearExposure() {
1864+
#if defined(HD_HAS_linearExposure)
1865+
return HdGet_linearExposure();
1866+
#else
1867+
return 1;
1868+
#endif
1869+
}
18491870
vec4 GetViewport() {
18501871
#if defined(HD_HAS_viewport)
18511872
return HdGet_viewport();
@@ -2456,6 +2477,9 @@ vec4 ShadingTerminal(vec4 Peye, vec3 Neye, vec4 color, vec4 patchCoord)
24562477
shadingColor);
24572478
#endif
24582479

2480+
// Modify the shaded color by camera exposure.
2481+
shadingColor.rgb *= GetLinearExposure();
2482+
24592483
reprColor.rgb = reprStyle.useSurfaceShaderColor ?
24602484
shadingColor.rgb :
24612485
reprColor.rgb;
@@ -3055,6 +3079,13 @@ float GetLightingBlendAmount() {
30553079
return 1;
30563080
#endif
30573081
}
3082+
float GetLinearExposure() {
3083+
#if defined(HD_HAS_linearExposure)
3084+
return HdGet_linearExposure();
3085+
#else
3086+
return 1;
3087+
#endif
3088+
}
30583089
vec4 GetViewport() {
30593090
#if defined(HD_HAS_viewport)
30603091
return HdGet_viewport();
@@ -3821,6 +3852,13 @@ float GetLightingBlendAmount() {
38213852
return 1;
38223853
#endif
38233854
}
3855+
float GetLinearExposure() {
3856+
#if defined(HD_HAS_linearExposure)
3857+
return HdGet_linearExposure();
3858+
#else
3859+
return 1;
3860+
#endif
3861+
}
38243862
vec4 GetViewport() {
38253863
#if defined(HD_HAS_viewport)
38263864
return HdGet_viewport();
@@ -4613,6 +4651,13 @@ float GetLightingBlendAmount() {
46134651
return 1;
46144652
#endif
46154653
}
4654+
float GetLinearExposure() {
4655+
#if defined(HD_HAS_linearExposure)
4656+
return HdGet_linearExposure();
4657+
#else
4658+
return 1;
4659+
#endif
4660+
}
46164661
vec4 GetViewport() {
46174662
#if defined(HD_HAS_viewport)
46184663
return HdGet_viewport();
@@ -5223,6 +5268,9 @@ vec4 ShadingTerminal(vec4 Peye, vec3 Neye, vec4 color, vec4 patchCoord)
52235268
shadingColor);
52245269
#endif
52255270

5271+
// Modify the shaded color by camera exposure.
5272+
shadingColor.rgb *= GetLinearExposure();
5273+
52265274
reprColor.rgb = reprStyle.useSurfaceShaderColor ?
52275275
shadingColor.rgb :
52285276
reprColor.rgb;

pxr/imaging/hdSt/testenv/testHdStCodeGen_GL/baseline/codegen_mesh_edgeonly_blendwireframe.out

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,13 @@ float GetLightingBlendAmount() {
317317
return 1;
318318
#endif
319319
}
320+
float GetLinearExposure() {
321+
#if defined(HD_HAS_linearExposure)
322+
return HdGet_linearExposure();
323+
#else
324+
return 1;
325+
#endif
326+
}
320327
vec4 GetViewport() {
321328
#if defined(HD_HAS_viewport)
322329
return HdGet_viewport();
@@ -1083,6 +1090,13 @@ float GetLightingBlendAmount() {
10831090
return 1;
10841091
#endif
10851092
}
1093+
float GetLinearExposure() {
1094+
#if defined(HD_HAS_linearExposure)
1095+
return HdGet_linearExposure();
1096+
#else
1097+
return 1;
1098+
#endif
1099+
}
10861100
vec4 GetViewport() {
10871101
#if defined(HD_HAS_viewport)
10881102
return HdGet_viewport();
@@ -1846,6 +1860,13 @@ float GetLightingBlendAmount() {
18461860
return 1;
18471861
#endif
18481862
}
1863+
float GetLinearExposure() {
1864+
#if defined(HD_HAS_linearExposure)
1865+
return HdGet_linearExposure();
1866+
#else
1867+
return 1;
1868+
#endif
1869+
}
18491870
vec4 GetViewport() {
18501871
#if defined(HD_HAS_viewport)
18511872
return HdGet_viewport();
@@ -2462,6 +2483,9 @@ vec4 ShadingTerminal(vec4 Peye, vec3 Neye, vec4 color, vec4 patchCoord)
24622483
shadingColor);
24632484
#endif
24642485

2486+
// Modify the shaded color by camera exposure.
2487+
shadingColor.rgb *= GetLinearExposure();
2488+
24652489
reprColor.rgb = reprStyle.useSurfaceShaderColor ?
24662490
shadingColor.rgb :
24672491
reprColor.rgb;
@@ -3061,6 +3085,13 @@ float GetLightingBlendAmount() {
30613085
return 1;
30623086
#endif
30633087
}
3088+
float GetLinearExposure() {
3089+
#if defined(HD_HAS_linearExposure)
3090+
return HdGet_linearExposure();
3091+
#else
3092+
return 1;
3093+
#endif
3094+
}
30643095
vec4 GetViewport() {
30653096
#if defined(HD_HAS_viewport)
30663097
return HdGet_viewport();
@@ -3827,6 +3858,13 @@ float GetLightingBlendAmount() {
38273858
return 1;
38283859
#endif
38293860
}
3861+
float GetLinearExposure() {
3862+
#if defined(HD_HAS_linearExposure)
3863+
return HdGet_linearExposure();
3864+
#else
3865+
return 1;
3866+
#endif
3867+
}
38303868
vec4 GetViewport() {
38313869
#if defined(HD_HAS_viewport)
38323870
return HdGet_viewport();
@@ -4619,6 +4657,13 @@ float GetLightingBlendAmount() {
46194657
return 1;
46204658
#endif
46214659
}
4660+
float GetLinearExposure() {
4661+
#if defined(HD_HAS_linearExposure)
4662+
return HdGet_linearExposure();
4663+
#else
4664+
return 1;
4665+
#endif
4666+
}
46224667
vec4 GetViewport() {
46234668
#if defined(HD_HAS_viewport)
46244669
return HdGet_viewport();
@@ -5235,6 +5280,9 @@ vec4 ShadingTerminal(vec4 Peye, vec3 Neye, vec4 color, vec4 patchCoord)
52355280
shadingColor);
52365281
#endif
52375282

5283+
// Modify the shaded color by camera exposure.
5284+
shadingColor.rgb *= GetLinearExposure();
5285+
52385286
reprColor.rgb = reprStyle.useSurfaceShaderColor ?
52395287
shadingColor.rgb :
52405288
reprColor.rgb;

0 commit comments

Comments
 (0)