mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-16 10:08:36 +03:00
0028369: Visualization, Path Tracing - Expose radiance clamping setting in path tracing mode
New parameter was added in the vrenderparams command: vrenderparams -maxrad <value>
This commit is contained in:
parent
7a59f4ce9f
commit
b09447ed89
@ -60,6 +60,7 @@ public:
|
|||||||
AdaptiveScreenSampling (Standard_False),
|
AdaptiveScreenSampling (Standard_False),
|
||||||
ShowSamplingTiles (Standard_False),
|
ShowSamplingTiles (Standard_False),
|
||||||
TwoSidedBsdfModels (Standard_False),
|
TwoSidedBsdfModels (Standard_False),
|
||||||
|
RadianceClampingValue (30.0),
|
||||||
RebuildRayTracingShaders (Standard_False),
|
RebuildRayTracingShaders (Standard_False),
|
||||||
// stereoscopic parameters
|
// stereoscopic parameters
|
||||||
StereoMode (Graphic3d_StereoMode_QuadBuffer),
|
StereoMode (Graphic3d_StereoMode_QuadBuffer),
|
||||||
@ -102,6 +103,7 @@ public:
|
|||||||
Standard_Boolean AdaptiveScreenSampling; //!< enables/disables adaptive screen sampling mode for path tracing, FALSE by default
|
Standard_Boolean AdaptiveScreenSampling; //!< enables/disables adaptive screen sampling mode for path tracing, FALSE by default
|
||||||
Standard_Boolean ShowSamplingTiles; //!< enables/disables debug mode for adaptive screen sampling, FALSE by default
|
Standard_Boolean ShowSamplingTiles; //!< enables/disables debug mode for adaptive screen sampling, FALSE by default
|
||||||
Standard_Boolean TwoSidedBsdfModels; //!< forces path tracing to use two-sided versions of original one-sided scattering models
|
Standard_Boolean TwoSidedBsdfModels; //!< forces path tracing to use two-sided versions of original one-sided scattering models
|
||||||
|
Standard_ShortReal RadianceClampingValue; //!< maximum radiance value used for clamping radiance estimation.
|
||||||
Standard_Boolean RebuildRayTracingShaders; //!< forces rebuilding ray tracing shaders at the next frame
|
Standard_Boolean RebuildRayTracingShaders; //!< forces rebuilding ray tracing shaders at the next frame
|
||||||
|
|
||||||
Graphic3d_StereoMode StereoMode; //!< stereoscopic output mode, Graphic3d_StereoMode_QuadBuffer by default
|
Graphic3d_StereoMode StereoMode; //!< stereoscopic output mode, Graphic3d_StereoMode_QuadBuffer by default
|
||||||
|
@ -581,10 +581,13 @@ protected: //! @name data types related to ray-tracing
|
|||||||
OpenGl_RT_uOffsetY,
|
OpenGl_RT_uOffsetY,
|
||||||
OpenGl_RT_uSamples,
|
OpenGl_RT_uSamples,
|
||||||
|
|
||||||
// adaptive path tracing images
|
// images used by ISS mode
|
||||||
OpenGl_RT_uRenderImage,
|
OpenGl_RT_uRenderImage,
|
||||||
OpenGl_RT_uOffsetImage,
|
OpenGl_RT_uOffsetImage,
|
||||||
|
|
||||||
|
// maximum radiance value
|
||||||
|
OpenGl_RT_uMaxRadiance,
|
||||||
|
|
||||||
OpenGl_RT_NbVariables // special field
|
OpenGl_RT_NbVariables // special field
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -702,6 +705,12 @@ protected: //! @name data types related to ray-tracing
|
|||||||
//! Enables/disables adaptive screen sampling for path tracing.
|
//! Enables/disables adaptive screen sampling for path tracing.
|
||||||
Standard_Boolean AdaptiveScreenSampling;
|
Standard_Boolean AdaptiveScreenSampling;
|
||||||
|
|
||||||
|
//! Enables/disables environment map for background.
|
||||||
|
Standard_Boolean UseEnvMapForBackground;
|
||||||
|
|
||||||
|
//! Maximum radiance value used for clamping radiance estimation.
|
||||||
|
Standard_ShortReal RadianceClampingValue;
|
||||||
|
|
||||||
//! Creates default compile-time ray-tracing parameters.
|
//! Creates default compile-time ray-tracing parameters.
|
||||||
RaytracingParams()
|
RaytracingParams()
|
||||||
: StackSize (THE_DEFAULT_STACK_SIZE),
|
: StackSize (THE_DEFAULT_STACK_SIZE),
|
||||||
@ -710,7 +719,9 @@ protected: //! @name data types related to ray-tracing
|
|||||||
GlobalIllumination (Standard_False),
|
GlobalIllumination (Standard_False),
|
||||||
UseBindlessTextures (Standard_False),
|
UseBindlessTextures (Standard_False),
|
||||||
TwoSidedBsdfModels (Standard_False),
|
TwoSidedBsdfModels (Standard_False),
|
||||||
AdaptiveScreenSampling (Standard_False) { }
|
AdaptiveScreenSampling (Standard_False),
|
||||||
|
UseEnvMapForBackground (Standard_False),
|
||||||
|
RadianceClampingValue (30.0) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Describes state of OpenGL structure.
|
//! Describes state of OpenGL structure.
|
||||||
|
@ -1731,6 +1731,9 @@ Standard_Boolean OpenGl_View::initRaytraceResources (const Handle(OpenGl_Context
|
|||||||
aShaderProgram->GetUniformLocation (theGlContext, "uBackColorTop");
|
aShaderProgram->GetUniformLocation (theGlContext, "uBackColorTop");
|
||||||
myUniformLocations[anIndex][OpenGl_RT_uBackColorBot] =
|
myUniformLocations[anIndex][OpenGl_RT_uBackColorBot] =
|
||||||
aShaderProgram->GetUniformLocation (theGlContext, "uBackColorBot");
|
aShaderProgram->GetUniformLocation (theGlContext, "uBackColorBot");
|
||||||
|
|
||||||
|
myUniformLocations[anIndex][OpenGl_RT_uMaxRadiance] =
|
||||||
|
aShaderProgram->GetUniformLocation (theGlContext, "uMaxRadiance");
|
||||||
}
|
}
|
||||||
|
|
||||||
theGlContext->BindProgram (myOutImageProgram);
|
theGlContext->BindProgram (myOutImageProgram);
|
||||||
@ -2465,38 +2468,24 @@ Standard_Boolean OpenGl_View::setUniformState (const Standard_Integer the
|
|||||||
theProgram->SetUniform (theGlContext,
|
theProgram->SetUniform (theGlContext,
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uUnviewMat], anUnviewMat);
|
myUniformLocations[theProgramId][OpenGl_RT_uUnviewMat], anUnviewMat);
|
||||||
|
|
||||||
// Set ray-tracing intersection parameters
|
|
||||||
theProgram->SetUniform (theGlContext,
|
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uSceneRad], myRaytraceSceneRadius);
|
|
||||||
theProgram->SetUniform (theGlContext,
|
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uSceneEps], myRaytraceSceneEpsilon);
|
|
||||||
|
|
||||||
const Standard_Integer aLightSourceBufferSize =
|
|
||||||
static_cast<Standard_Integer> (myRaytraceGeometry.Sources.size());
|
|
||||||
|
|
||||||
// Set ray-tracing light source parameters
|
|
||||||
theProgram->SetUniform (theGlContext,
|
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uLightCount], aLightSourceBufferSize);
|
|
||||||
theProgram->SetUniform (theGlContext,
|
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uLightAmbnt], myRaytraceGeometry.Ambient);
|
|
||||||
|
|
||||||
// Enable/disable run-time rendering effects
|
|
||||||
theProgram->SetUniform (theGlContext,
|
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uShadowsEnabled], myRenderParams.IsShadowEnabled ? 1 : 0);
|
|
||||||
theProgram->SetUniform (theGlContext,
|
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uReflectEnabled], myRenderParams.IsReflectionEnabled ? 1 : 0);
|
|
||||||
|
|
||||||
// Set screen dimensions
|
// Set screen dimensions
|
||||||
myRaytraceProgram->SetUniform (theGlContext,
|
myRaytraceProgram->SetUniform (theGlContext,
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uWinSizeX], theWinSizeX);
|
myUniformLocations[theProgramId][OpenGl_RT_uWinSizeX], theWinSizeX);
|
||||||
myRaytraceProgram->SetUniform (theGlContext,
|
myRaytraceProgram->SetUniform (theGlContext,
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uWinSizeY], theWinSizeY);
|
myUniformLocations[theProgramId][OpenGl_RT_uWinSizeY], theWinSizeY);
|
||||||
|
|
||||||
if (myRenderParams.IsGlobalIlluminationEnabled) // if Monte-Carlo sampling enabled
|
// Set 3D scene parameters
|
||||||
{
|
|
||||||
theProgram->SetUniform (theGlContext,
|
theProgram->SetUniform (theGlContext,
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uBlockedRngEnabled], myRenderParams.CoherentPathTracingMode ? 1 : 0);
|
myUniformLocations[theProgramId][OpenGl_RT_uSceneRad], myRaytraceSceneRadius);
|
||||||
}
|
theProgram->SetUniform (theGlContext,
|
||||||
|
myUniformLocations[theProgramId][OpenGl_RT_uSceneEps], myRaytraceSceneEpsilon);
|
||||||
|
|
||||||
|
// Set light source parameters
|
||||||
|
const Standard_Integer aLightSourceBufferSize =
|
||||||
|
static_cast<Standard_Integer> (myRaytraceGeometry.Sources.size());
|
||||||
|
|
||||||
|
theProgram->SetUniform (theGlContext,
|
||||||
|
myUniformLocations[theProgramId][OpenGl_RT_uLightCount], aLightSourceBufferSize);
|
||||||
|
|
||||||
// Set array of 64-bit texture handles
|
// Set array of 64-bit texture handles
|
||||||
if (theGlContext->arbTexBindless != NULL && myRaytraceGeometry.HasTextures())
|
if (theGlContext->arbTexBindless != NULL && myRaytraceGeometry.HasTextures())
|
||||||
@ -2525,6 +2514,7 @@ Standard_Boolean OpenGl_View::setUniformState (const Standard_Integer the
|
|||||||
myUniformLocations[theProgramId][OpenGl_RT_uBackColorBot], aBackColor);
|
myUniformLocations[theProgramId][OpenGl_RT_uBackColorBot], aBackColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set environment map parameters
|
||||||
const Standard_Boolean toDisableEnvironmentMap = myTextureEnv.IsNull() || !myTextureEnv->IsValid();
|
const Standard_Boolean toDisableEnvironmentMap = myTextureEnv.IsNull() || !myTextureEnv->IsValid();
|
||||||
|
|
||||||
theProgram->SetUniform (theGlContext,
|
theProgram->SetUniform (theGlContext,
|
||||||
@ -2533,6 +2523,37 @@ Standard_Boolean OpenGl_View::setUniformState (const Standard_Integer the
|
|||||||
theProgram->SetUniform (theGlContext,
|
theProgram->SetUniform (theGlContext,
|
||||||
myUniformLocations[theProgramId][OpenGl_RT_uSphereMapForBack], myRenderParams.UseEnvironmentMapBackground ? 1 : 0);
|
myUniformLocations[theProgramId][OpenGl_RT_uSphereMapForBack], myRenderParams.UseEnvironmentMapBackground ? 1 : 0);
|
||||||
|
|
||||||
|
if (myRenderParams.IsGlobalIlluminationEnabled) // GI parameters
|
||||||
|
{
|
||||||
|
theProgram->SetUniform (theGlContext,
|
||||||
|
myUniformLocations[theProgramId][OpenGl_RT_uMaxRadiance], myRenderParams.RadianceClampingValue);
|
||||||
|
|
||||||
|
theProgram->SetUniform (theGlContext,
|
||||||
|
myUniformLocations[theProgramId][OpenGl_RT_uBlockedRngEnabled], myRenderParams.CoherentPathTracingMode ? 1 : 0);
|
||||||
|
|
||||||
|
// Check whether we should restart accumulation for run-time parameters
|
||||||
|
if (myRenderParams.RadianceClampingValue != myRaytraceParameters.RadianceClampingValue
|
||||||
|
|| myRenderParams.UseEnvironmentMapBackground != myRaytraceParameters.UseEnvMapForBackground)
|
||||||
|
{
|
||||||
|
myAccumFrames = 0; // accumulation should be restarted
|
||||||
|
|
||||||
|
myRaytraceParameters.RadianceClampingValue = myRenderParams.RadianceClampingValue;
|
||||||
|
myRaytraceParameters.UseEnvMapForBackground = myRenderParams.UseEnvironmentMapBackground;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // RT parameters
|
||||||
|
{
|
||||||
|
// Set ambient light source
|
||||||
|
theProgram->SetUniform (theGlContext,
|
||||||
|
myUniformLocations[theProgramId][OpenGl_RT_uLightAmbnt], myRaytraceGeometry.Ambient);
|
||||||
|
|
||||||
|
// Enable/disable run-time ray-tracing effects
|
||||||
|
theProgram->SetUniform (theGlContext,
|
||||||
|
myUniformLocations[theProgramId][OpenGl_RT_uShadowsEnabled], myRenderParams.IsShadowEnabled ? 1 : 0);
|
||||||
|
theProgram->SetUniform (theGlContext,
|
||||||
|
myUniformLocations[theProgramId][OpenGl_RT_uReflectEnabled], myRenderParams.IsReflectionEnabled ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
return Standard_True;
|
return Standard_True;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -785,7 +785,7 @@ vec4 PathTrace (in SRay theRay, in vec3 theInverse)
|
|||||||
vec4 aTexColor = textureLod (
|
vec4 aTexColor = textureLod (
|
||||||
sampler2D (uTextureSamplers[int (aMaterial.Kd.w)]), aTexCoord.st, 0.f);
|
sampler2D (uTextureSamplers[int (aMaterial.Kd.w)]), aTexCoord.st, 0.f);
|
||||||
|
|
||||||
aMaterial.Kd.rgb *= (aTexColor.rgb, aTexColor.rgb) * aTexColor.w; // de-gamma correction (for gamma = 2)
|
aMaterial.Kd.rgb *= (aTexColor.rgb * aTexColor.rgb) * aTexColor.w; // de-gamma correction (for gamma = 2)
|
||||||
|
|
||||||
if (aTexColor.w != 1.0f)
|
if (aTexColor.w != 1.0f)
|
||||||
{
|
{
|
||||||
|
@ -13,9 +13,9 @@ uniform int uBlockedRngEnabled;
|
|||||||
uniform sampler2D uAccumTexture;
|
uniform sampler2D uAccumTexture;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//! Maximum radiance that can be added to the pixel. Decreases noise
|
//! Maximum radiance that can be added to the pixel.
|
||||||
//! level, but introduces some bias.
|
//! Decreases noise level, but introduces some bias.
|
||||||
#define MAX_RADIANCE vec3 (50.f)
|
uniform float uMaxRadiance = 50.f;
|
||||||
|
|
||||||
// =======================================================================
|
// =======================================================================
|
||||||
// function : main
|
// function : main
|
||||||
@ -64,7 +64,7 @@ void main (void)
|
|||||||
aColor.rgb = ZERO;
|
aColor.rgb = ZERO;
|
||||||
}
|
}
|
||||||
|
|
||||||
aColor.rgb = min (aColor.rgb, MAX_RADIANCE);
|
aColor.rgb = min (aColor.rgb, vec3 (uMaxRadiance));
|
||||||
|
|
||||||
#ifdef ADAPTIVE_SAMPLING
|
#ifdef ADAPTIVE_SAMPLING
|
||||||
|
|
||||||
|
@ -788,7 +788,7 @@ static const char Shaders_PathtraceBase_fs[] =
|
|||||||
" vec4 aTexColor = textureLod (\n"
|
" vec4 aTexColor = textureLod (\n"
|
||||||
" sampler2D (uTextureSamplers[int (aMaterial.Kd.w)]), aTexCoord.st, 0.f);\n"
|
" sampler2D (uTextureSamplers[int (aMaterial.Kd.w)]), aTexCoord.st, 0.f);\n"
|
||||||
"\n"
|
"\n"
|
||||||
" aMaterial.Kd.rgb *= (aTexColor.rgb, aTexColor.rgb) * aTexColor.w; // de-gamma correction (for gamma = 2)\n"
|
" aMaterial.Kd.rgb *= (aTexColor.rgb * aTexColor.rgb) * aTexColor.w; // de-gamma correction (for gamma = 2)\n"
|
||||||
"\n"
|
"\n"
|
||||||
" if (aTexColor.w != 1.0f)\n"
|
" if (aTexColor.w != 1.0f)\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
|
@ -16,9 +16,9 @@ static const char Shaders_RaytraceRender_fs[] =
|
|||||||
" uniform sampler2D uAccumTexture;\n"
|
" uniform sampler2D uAccumTexture;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"\n"
|
"\n"
|
||||||
"//! Maximum radiance that can be added to the pixel. Decreases noise\n"
|
"//! Maximum radiance that can be added to the pixel.\n"
|
||||||
"//! level, but introduces some bias.\n"
|
"//! Decreases noise level, but introduces some bias.\n"
|
||||||
"#define MAX_RADIANCE vec3 (50.f)\n"
|
"uniform float uMaxRadiance = 50.f;\n"
|
||||||
"\n"
|
"\n"
|
||||||
"// =======================================================================\n"
|
"// =======================================================================\n"
|
||||||
"// function : main\n"
|
"// function : main\n"
|
||||||
@ -67,7 +67,7 @@ static const char Shaders_RaytraceRender_fs[] =
|
|||||||
" aColor.rgb = ZERO;\n"
|
" aColor.rgb = ZERO;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"\n"
|
"\n"
|
||||||
" aColor.rgb = min (aColor.rgb, MAX_RADIANCE);\n"
|
" aColor.rgb = min (aColor.rgb, vec3 (uMaxRadiance));\n"
|
||||||
"\n"
|
"\n"
|
||||||
"#ifdef ADAPTIVE_SAMPLING\n"
|
"#ifdef ADAPTIVE_SAMPLING\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
@ -9075,6 +9075,7 @@ static Standard_Integer VRenderParams (Draw_Interpretor& theDI,
|
|||||||
theDI << "iss: " << (aParams.AdaptiveScreenSampling ? "on" : "off") << "\n";
|
theDI << "iss: " << (aParams.AdaptiveScreenSampling ? "on" : "off") << "\n";
|
||||||
theDI << "iss debug: " << (aParams.ShowSamplingTiles ? "on" : "off") << "\n";
|
theDI << "iss debug: " << (aParams.ShowSamplingTiles ? "on" : "off") << "\n";
|
||||||
theDI << "two-sided BSDF: " << (aParams.TwoSidedBsdfModels ? "on" : "off") << "\n";
|
theDI << "two-sided BSDF: " << (aParams.TwoSidedBsdfModels ? "on" : "off") << "\n";
|
||||||
|
theDI << "max radiance: " << aParams.RadianceClampingValue << "\n";
|
||||||
theDI << "shadingModel: ";
|
theDI << "shadingModel: ";
|
||||||
switch (aView->ShadingModel())
|
switch (aView->ShadingModel())
|
||||||
{
|
{
|
||||||
@ -9300,6 +9301,37 @@ static Standard_Integer VRenderParams (Draw_Interpretor& theDI,
|
|||||||
}
|
}
|
||||||
aParams.CoherentPathTracingMode = toEnable;
|
aParams.CoherentPathTracingMode = toEnable;
|
||||||
}
|
}
|
||||||
|
else if (aFlag == "-maxrad")
|
||||||
|
{
|
||||||
|
if (toPrint)
|
||||||
|
{
|
||||||
|
theDI << aParams.RadianceClampingValue << " ";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (++anArgIter >= theArgNb)
|
||||||
|
{
|
||||||
|
std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TCollection_AsciiString aMaxRadStr = theArgVec[anArgIter];
|
||||||
|
if (!aMaxRadStr.IsRealValue())
|
||||||
|
{
|
||||||
|
std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Standard_Real aMaxRadiance = aMaxRadStr.RealValue();
|
||||||
|
if (aMaxRadiance <= 0.0)
|
||||||
|
{
|
||||||
|
std::cerr << "Error: invalid radiance clamping value " << aMaxRadiance << ".\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
aParams.RadianceClampingValue = static_cast<Standard_ShortReal> (aMaxRadiance);
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (aFlag == "-iss")
|
else if (aFlag == "-iss")
|
||||||
{
|
{
|
||||||
if (toPrint)
|
if (toPrint)
|
||||||
@ -10906,6 +10938,7 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
|
|||||||
"\n '-twoside on|off' Enables/disables two-sided BSDF models (PT mode)"
|
"\n '-twoside on|off' Enables/disables two-sided BSDF models (PT mode)"
|
||||||
"\n '-iss on|off' Enables/disables adaptive screen sampling (PT mode)"
|
"\n '-iss on|off' Enables/disables adaptive screen sampling (PT mode)"
|
||||||
"\n '-issd on|off' Shows screen sampling distribution in ISS mode"
|
"\n '-issd on|off' Shows screen sampling distribution in ISS mode"
|
||||||
|
"\n '-maxrad > 0.0' Value used for clamping radiance estimation (PT mode)"
|
||||||
"\n '-rebuildGlsl on|off' Rebuild Ray-Tracing GLSL programs (for debugging)"
|
"\n '-rebuildGlsl on|off' Rebuild Ray-Tracing GLSL programs (for debugging)"
|
||||||
"\n '-shadingModel model' Controls shading model from enumeration"
|
"\n '-shadingModel model' Controls shading model from enumeration"
|
||||||
"\n color, flat, gouraud, phong"
|
"\n color, flat, gouraud, phong"
|
||||||
|
22
tests/v3d/raytrace/sample_cube_clamp
Normal file
22
tests/v3d/raytrace/sample_cube_clamp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
puts "============"
|
||||||
|
puts "Visualization - Path Tracing, Cube sample with radiance clamping"
|
||||||
|
puts "============"
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
source $env(CSF_OCCTSamplesPath)/tcl/pathtrace_cube.tcl
|
||||||
|
|
||||||
|
vrenderparams -maxrad 1.0
|
||||||
|
vfps 100
|
||||||
|
vdump $imagedir/${casename}_1.png
|
||||||
|
|
||||||
|
vrenderparams -maxrad 2.0
|
||||||
|
vfps 100
|
||||||
|
vdump $imagedir/${casename}_2.png
|
||||||
|
|
||||||
|
vrenderparams -maxrad 10.0
|
||||||
|
vfps 100
|
||||||
|
vdump $imagedir/${casename}_10.png
|
||||||
|
|
||||||
|
vrenderparams -maxrad 100.0
|
||||||
|
vfps 100
|
||||||
|
vdump $imagedir/${casename}_100.png
|
Loading…
x
Reference in New Issue
Block a user