OpenGl_RT_uOffsetX,
OpenGl_RT_uOffsetY,
OpenGl_RT_uSamples,
+ OpenGl_RT_uWinSizeX,
+ OpenGl_RT_uWinSizeY,
OpenGl_RT_uTextures,
//! Sets uniform state for the given ray-tracing shader program.
Standard_Boolean SetUniformState (const Graphic3d_CView& theCView,
+ const Standard_Integer theSizeX,
+ const Standard_Integer theSizeY,
const OpenGl_Vec3* theOrigins,
const OpenGl_Vec3* theDirects,
const OpenGl_Mat4& theUnviewMat,
aShaderProgram->GetUniformLocation (myGlContext, "uOffsetY");
myUniformLocations[anIndex][OpenGl_RT_uSamples] =
aShaderProgram->GetUniformLocation (myGlContext, "uSamples");
+ myUniformLocations[anIndex][OpenGl_RT_uWinSizeX] =
+ aShaderProgram->GetUniformLocation (myGlContext, "uWinSizeX");
+ myUniformLocations[anIndex][OpenGl_RT_uWinSizeY] =
+ aShaderProgram->GetUniformLocation (myGlContext, "uWinSizeY");
myUniformLocations[anIndex][OpenGl_RT_uTextures] =
aShaderProgram->GetUniformLocation (myGlContext, "uTextureSamplers");
// purpose : Sets uniform state for the given ray-tracing shader program
// =======================================================================
Standard_Boolean OpenGl_Workspace::SetUniformState (const Graphic3d_CView& theCView,
+ const Standard_Integer theSizeX,
+ const Standard_Integer theSizeY,
const OpenGl_Vec3* theOrigins,
const OpenGl_Vec3* theDirects,
const OpenGl_Mat4& theUnviewMat,
aResult &= theRaytraceProgram->SetUniform (myGlContext,
myUniformLocations[theProgramIndex][OpenGl_RT_uUnviewMat], theUnviewMat);
+ // Set window size
+ aResult &= theRaytraceProgram->SetUniform (myGlContext,
+ myUniformLocations[theProgramIndex][OpenGl_RT_uWinSizeX], theSizeX);
+ aResult &= theRaytraceProgram->SetUniform (myGlContext,
+ myUniformLocations[theProgramIndex][OpenGl_RT_uWinSizeY], theSizeY);
+
// Set scene parameters
aResult &= theRaytraceProgram->SetUniform (myGlContext,
myUniformLocations[theProgramIndex][OpenGl_RT_uSceneRad], myRaytraceSceneRadius);
if (!aResult)
{
#ifdef RAY_TRACE_PRINT_INFO
- std::cout << "Error: Failed to set uniform state for ray-tracing program" << theProgramIndex << std::endl;
+ std::cout << "Info: Not all uniforms were detected (for program " << theProgramIndex << ")" << std::endl;
#endif
}
myGlContext->BindProgram (myRaytraceProgram);
SetUniformState (theCView,
+ theSizeX,
+ theSizeY,
theOrigins,
theDirects,
theUnviewMat,
myGlContext->BindProgram (myPostFSAAProgram);
SetUniformState (theCView,
+ theSizeX,
+ theSizeY,
theOrigins,
theDirects,
theUnviewMat,
//! Origin of viewing ray in right-bottom corner.
uniform vec3 uOriginRB;
+//! Width of the rendering window.
+uniform int uWinSizeX;
+//! Height of the rendering window.
+uniform int uWinSizeY;
+
//! Direction of viewing ray in left-top corner.
uniform vec3 uDirectLT;
//! Direction of viewing ray in left-bottom corner.
dot (m2.xyz, v));
}
+//! 32-bit state of random number generator.
+uint RandState;
+
+// =======================================================================
+// function : SeedRand
+// purpose : Applies hash function by Thomas Wang to randomize seeds
+// (see http://www.burtleburtle.net/bob/hash/integer.html)
+// =======================================================================
+void SeedRand (in int theSeed)
+{
+ RandState = uint (int (gl_FragCoord.y) * uWinSizeX + int (gl_FragCoord.x) + theSeed);
+
+ RandState = (RandState + 0x479ab41du) + (RandState << 8);
+ RandState = (RandState ^ 0xe4aa10ceu) ^ (RandState >> 5);
+ RandState = (RandState + 0x9942f0a6u) - (RandState << 14);
+ RandState = (RandState ^ 0x5aedd67du) ^ (RandState >> 3);
+ RandState = (RandState + 0x17bea992u) + (RandState << 7);
+}
+
+// =======================================================================
+// function : RandInt
+// purpose : Generates integer using Xorshift algorithm by G. Marsaglia
+// =======================================================================
+uint RandInt()
+{
+ RandState ^= (RandState << 13);
+ RandState ^= (RandState >> 17);
+ RandState ^= (RandState << 5);
+
+ return RandState;
+}
+
+// =======================================================================
+// function : RandFloat
+// purpose : Generates a random float in [0, 1) range
+// =======================================================================
+float RandFloat()
+{
+ return float (RandInt()) * (1.f / 4294967296.f);
+}
+
// =======================================================================
// function : MatrixColMultiplyPnt
// purpose : Multiplies a vector by matrix