Skip to content

Commit f53d3e6

Browse files
committed
[hdEmbree] add HDEMBREE_RANDOM_NUMBER_SEED
1 parent e1cfe97 commit f53d3e6

File tree

7 files changed

+57
-7
lines changed

7 files changed

+57
-7
lines changed

pxr/imaging/plugin/hdEmbree/config.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ TF_DEFINE_ENV_SETTING(
5151
HdEmbreeDefaultCameraLightIntensity,
5252
"Intensity of the camera light, specified as a percentage of <1,1,1>.");
5353

54+
TF_DEFINE_ENV_SETTING(
55+
HDEMBREE_RANDOM_NUMBER_SEED,
56+
HdEmbreeDefaultRandomNumberSeed,
57+
"Seed to give to the random number generator. A value of anything other"
58+
" than -1, combined with setting PXR_WORK_THREAD_LIMIT=1, should"
59+
" give deterministic / repeatable results. A value of -1 (the"
60+
" default) will allow the implementation to set a value that varies"
61+
" from invocation to invocation and thread to thread.");
62+
5463
TF_DEFINE_ENV_SETTING(HDEMBREE_PRINT_CONFIGURATION,
5564
false,
5665
"Should HdEmbree print configuration on startup?");
@@ -68,6 +77,7 @@ HdEmbreeConfig::HdEmbreeConfig()
6877
useFaceColors = (TfGetEnvSetting(HDEMBREE_USE_FACE_COLORS));
6978
cameraLightIntensity = (std::max(100,
7079
TfGetEnvSetting(HDEMBREE_CAMERA_LIGHT_INTENSITY)) / 100.0f);
80+
randomNumberSeed = TfGetEnvSetting(HDEMBREE_RANDOM_NUMBER_SEED);
7181

7282
if (TfGetEnvSetting(HDEMBREE_PRINT_CONFIGURATION)) {
7383
std::cout
@@ -84,6 +94,8 @@ HdEmbreeConfig::HdEmbreeConfig()
8494
<< useFaceColors << "\n"
8595
<< " cameraLightIntensity = "
8696
<< cameraLightIntensity << "\n"
97+
<< " randomNumberSeed = "
98+
<< randomNumberSeed << "\n"
8799
;
88100
}
89101
}

pxr/imaging/plugin/hdEmbree/config.h

+10
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ constexpr int HdEmbreeDefaultAmbientOcclusionSamples = 16;
2020
constexpr bool HdEmbreeDefaultJitterCamera = true;
2121
constexpr bool HdEmbreeDefaultUseFaceColors = true;
2222
constexpr int HdEmbreeDefaultCameraLightIntensity = 300;
23+
constexpr int HdEmbreeDefaultRandomNumberSeed = -1;
2324

2425
/// \class HdEmbreeConfig
2526
///
@@ -79,6 +80,15 @@ class HdEmbreeConfig {
7980
/// Override with *HDEMBREE_CAMERA_LIGHT_INTENSITY*.
8081
float cameraLightIntensity = HdEmbreeDefaultCameraLightIntensity;
8182

83+
/// Seed to give to the random number generator. A value of anything other
84+
/// than -1, combined with setting PXR_WORK_THREAD_LIMIT=1, should give
85+
/// deterministic / repeatable results. A value of -1 (the default) will
86+
/// allow the implementation to set a value that varies from invocation to
87+
/// invocation and thread to thread.
88+
///
89+
/// Override with *HDEMBREE_RANDOM_NUMBER_SEED*.
90+
int randomNumberSeed = HdEmbreeDefaultRandomNumberSeed;
91+
8292
private:
8393
// The constructor initializes the config variables with their
8494
// default or environment-provided override, and optionally prints

pxr/imaging/plugin/hdEmbree/renderDelegate.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ void
9999
HdEmbreeRenderDelegate::_Initialize()
100100
{
101101
// Initialize the settings and settings descriptors.
102-
_settingDescriptors.resize(4);
102+
_settingDescriptors.resize(5);
103103
_settingDescriptors[0] = { "Enable Scene Colors",
104104
HdEmbreeRenderSettingsTokens->enableSceneColors,
105105
VtValue(HdEmbreeConfig::GetInstance().useFaceColors) };
@@ -112,6 +112,9 @@ HdEmbreeRenderDelegate::_Initialize()
112112
_settingDescriptors[3] = { "Samples To Convergence",
113113
HdRenderSettingsTokens->convergedSamplesPerPixel,
114114
VtValue(int(HdEmbreeConfig::GetInstance().samplesToConvergence)) };
115+
_settingDescriptors[4] = { "Random Number Seed",
116+
HdEmbreeRenderSettingsTokens->randomNumberSeed,
117+
VtValue(HdEmbreeConfig::GetInstance().randomNumberSeed) };
115118
_PopulateDefaultSettings(_settingDescriptors);
116119

117120
// Initialize the embree library handle (_rtcDevice).

pxr/imaging/plugin/hdEmbree/renderDelegate.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ class HdEmbreeRenderParam;
2323
#define HDEMBREE_RENDER_SETTINGS_TOKENS \
2424
(enableAmbientOcclusion) \
2525
(enableSceneColors) \
26-
(ambientOcclusionSamples)
26+
(ambientOcclusionSamples) \
27+
(randomNumberSeed)
2728

2829
// Also: HdRenderSettingsTokens->convergedSamplesPerPixel
2930

pxr/imaging/plugin/hdEmbree/renderPass.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ HdEmbreeRenderPass::_Execute(HdRenderPassStateSharedPtr const& renderPassState,
113113
renderDelegate->GetRenderSetting<bool>(
114114
HdEmbreeRenderSettingsTokens->enableSceneColors, true));
115115

116+
_renderer->SetRandomNumberSeed(
117+
renderDelegate->GetRenderSetting<unsigned int>(
118+
HdEmbreeRenderSettingsTokens->randomNumberSeed, (unsigned int)-1));
119+
116120
needStartRender = true;
117121
}
118122

pxr/imaging/plugin/hdEmbree/renderer.cpp

+16-4
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ HdEmbreeRenderer::SetEnableSceneColors(bool enableSceneColors)
6969
_enableSceneColors = enableSceneColors;
7070
}
7171

72+
void
73+
HdEmbreeRenderer::SetRandomNumberSeed(int randomNumberSeed)
74+
{
75+
_randomNumberSeed = randomNumberSeed;
76+
}
77+
7278
void
7379
HdEmbreeRenderer::SetDataWindow(const GfRect2i &dataWindow)
7480
{
@@ -432,8 +438,8 @@ HdEmbreeRenderer::Render(HdRenderThread *renderThread)
432438
// Always pass the renderThread to _RenderTiles to allow the first frame
433439
// to be interrupted.
434440
WorkParallelForN(numTilesX*numTilesY,
435-
std::bind(&HdEmbreeRenderer::_RenderTiles, this, renderThread,
436-
std::placeholders::_1, std::placeholders::_2));
441+
std::bind(&HdEmbreeRenderer::_RenderTiles, this,
442+
renderThread, i, std::placeholders::_1, std::placeholders::_2));
437443

438444
// After the first pass, mark the single-sampled attachments as
439445
// converged and unmap them. If there are no multisampled attachments,
@@ -472,7 +478,7 @@ HdEmbreeRenderer::Render(HdRenderThread *renderThread)
472478
}
473479

474480
void
475-
HdEmbreeRenderer::_RenderTiles(HdRenderThread *renderThread,
481+
HdEmbreeRenderer::_RenderTiles(HdRenderThread *renderThread, int sampleNum,
476482
size_t tileStart, size_t tileEnd)
477483
{
478484
const unsigned int minX = _dataWindow.GetMinX();
@@ -497,8 +503,14 @@ HdEmbreeRenderer::_RenderTiles(HdRenderThread *renderThread,
497503

498504
// Initialize the RNG for this tile (each tile creates one as
499505
// a lazy way to do thread-local RNGs).
500-
size_t seed = std::chrono::system_clock::now().time_since_epoch().count();
506+
size_t seed;
507+
if (_randomNumberSeed == -1) {
508+
seed = std::chrono::system_clock::now().time_since_epoch().count();
509+
} else {
510+
seed = static_cast<size_t>(_randomNumberSeed);
511+
}
501512
seed = TfHash::Combine(seed, tileStart);
513+
seed = TfHash::Combine(seed, sampleNum);
502514
std::default_random_engine random(seed);
503515

504516
// Create a uniform distribution for jitter calculations.

pxr/imaging/plugin/hdEmbree/renderer.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ class HdEmbreeRenderer final
8181
/// everything as white.
8282
void SetEnableSceneColors(bool enableSceneColors);
8383

84+
/// Sets a number to seed the random number generator with.
85+
/// \param randomNumberSeed If -1, then the random number generator
86+
/// is seeded in a non-deterministic way;
87+
/// otherwise, it is seeded with this value.
88+
void SetRandomNumberSeed(int randomNumberSeed);
89+
8490
/// Rendering entrypoint: add one sample per pixel to the whole sample
8591
/// buffer, and then loop until the image is converged. After each pass,
8692
/// the image will be resolved into a color buffer.
@@ -115,7 +121,7 @@ class HdEmbreeRenderer final
115121
// work. For each tile, iterate over pixels in the tile, generating camera
116122
// rays, and following them/calculating color with _TraceRay. This function
117123
// renders all tiles between tileStart and tileEnd.
118-
void _RenderTiles(HdRenderThread *renderThread,
124+
void _RenderTiles(HdRenderThread *renderThread, int sampleNum,
119125
size_t tileStart, size_t tileEnd);
120126

121127
// Cast a ray into the scene and if it hits an object, write to the bound
@@ -184,6 +190,8 @@ class HdEmbreeRenderer final
184190
int _ambientOcclusionSamples;
185191
// Should we enable scene colors?
186192
bool _enableSceneColors;
193+
// If other than -1, use this to seed the random number generator with.
194+
int _randomNumberSeed;
187195

188196
// How many samples have been completed.
189197
std::atomic<int> _completedSamples;

0 commit comments

Comments
 (0)