6.0
Overview
This release of Falcor provides the following significant improvements and new features:
- Initial work on making Falcor available as a Python module in an external Python environment.
- Introduce a plugin system for handling render passes and scene importers.
- Remove native D3D12 backend and switch to Slang/GFX exclusively for supporting both D3D12 and Vulkan.
- Remove legacy raster code that was not maintained and far from state-of-the-art.
- Replace
glm
with custom vector/matrix classes with more aligned sematics to Slang. - Introduce intrusive reference counted
Object
base class and replaceType::SharedPtr
withref<Type>
. - Improved Linux support.
- Introduce
clang-format
for automatic code formatting of both C/C++ and Slang source files.
Dependencies
- Update
slang
to2023.0.3
. - Update
nvapi
toR520
. - Update
dlss
to3.1.0
. - Update
ImGUI
to latestdocking
branch. - Update
dxcompiler
to1.7.2207
. - Update
Agility SDK
to1.606.3
. - Update
assimp
to5.2.5
. - Update
python
to3.10.11
. - Update
USD
to22.11
and switch tono-python
version. - Update
fmt
to10.0.0
. - Add
nlohmann::json
header-only library. - Add
pybind11_json
header-only library. - Switch from using
RapidJSON
tonlohmann::json
. - Stop including dependencies from
tiny-cuda-nn
globally into Falcor.
Project Structure
- Add new top-level
scripts
folder for render scripts. - Add new top-level
data
folder that contains all the data that was before spread within theSource
folder. - Write plugin libraries (dlls) to a separate
plugins
folder, de-cluttering the main output folder. - Reorganize
media
package:- Generally go to
snake_case
filenames. - Move everything into two folders:
test_scenes
andtest_images
. - Remove some obsolete files.
- Generally go to
Tooling
- Add
clang-format
for automatic code formatting. - Add
.clang-format-ignore
file to black-, and white-list paths. - Enable
clang-format
on all ofSource/Falcor/Core
,Source/Falcor/RenderGraph
,Source/Falcor/RenderPasses
,Source/Tools
, andSource/Samples
. - Add
tools/update_comment_style
script to automatically convert old to new comment style. - Improve
update_legal_headers.py
to abort ifgit
is unavailable and gracefully handle untracked files. - Extend
generate_stubs.py
with support for generating bindings for python submodules. - Add
pymacro
utility to expandPYMACRO
macros in C++ code. This utility is used inVectorMath.h
and the variousVectorSwizzleX.inl.h
files.
Coding Conventions
- Change the function comment coding convention for new code to utilize the existing tool support in Visual Studio and Visual Studio Code.
- Add coding rule that slang requires
1.f
float literals.
Project Templates
- Rename
PassLibraryTemplate
toRenderPassTemplate
. - Rename
ProjectTemplate
toSampleAppTemplate
. - Rename
make_new_render_pass_library
tomake_new_render_pass
. - Rename
make_new_sample
tomake_new_sample_app
. - Build templates by default to avoid bitrot.
Build System
- Build with VS2022/14.4 toolchain by default
- Remove
FALCOR_RENDER_BACKEND
cmake option. - Simplify build configurations because render backend configuration is gone now.
- Remove
d3d12
flag from VS setup scripts. - Fix missing includes.
- Extend header validation with option to ignore individual files.
- Add new cmake presets for building with additional settings for continuous integration.
- Use
FALCOR_SLANG_CONFIG
cmake cache option to switch between release and debug version of slang. - Debug version of slang is only available if you build slang yourself and point packman to it, e.g., via
dependencies.user.xml
. - Link
args
library directly in executables that use it. - Make internal dependencies of
Falcor
private, add dependencies to render passes where required. - Split
falcor_deps
into multiple finer grained targets. - Silence finding
git
during configure time. - Introduce
FALCOR_ENABLE_USD
to enable/disable compilation of components requiring USD. - Use
find_package
to find a python distribution. - Compile Falcor python bindings as a separate module and place it in the
python
directory in the output directory. - Setup python search path to locate the
falcor
module when starting the embedded python interpreter. - Move some targets to
Misc
folder in VS. - Embed git version info in Falcor library.
- Log version string on startup, (e.g.
Falcor 5.2 (commit: ab4852274, branch: git-version)
). - Copy
scripts
to binary output directory. - Use lower-case
shaders
folder in binary output directory. - Add
FALCOR_REPORT_EXCEPTION_AS_ERROR
cmake option to enable reporting exceptions as errors. - Generate
plugins.json
in output directory containing a list of all plugins. - Generate
setpath.xxx
scripts in output directory. - Generate python stub files for the
falcor
module. - Rename CMake preset
linux-ninja-clang
tolinux-clang
. - Add support for compiling with GCC (add
linux-gcc
CMake preset). - Compile with
_GLIBCXX_USE_CXX11_ABI=0
for compatibility with USD libraries. - Increase MSVC warnings to
/W4
and disable some specific warnings. - Generally enable "shadowing" warnings which avoids non-obvious bugs and paves the way to use text replacement for removing hungerian notation.
- Add
FALCOR_ENABLE_ASAN
cmake option to enable address sanitizer.
Remove Legacy Code
- Remove
VariablesBufferUI
. - Remove
CUDAProgram
. - Remove
EnvMapLighting
. - Remove
Perception
utils. - Remove
ModelViewer
sample. - Remove
RTXGI
module. - Remove
CSM
render pass. - Remove
FXAA
render passes. - Remove
SSAO
render pass. - Remove
SkyBox
render pass. - Remove
ForwardLightingPass
render pass. - Remove
DepthPass
render pass. - Remove
TemporalDelayPass
render pass.
Falcor Python Module
- Falcor no longer requires exact 3.7 Python version.
- Rename Falcor python extension module from
falcor
tofalcor_ext
and wrap it in afalcor
package that sets up the DLL search directory. - Fix Python naming conventions in the bindings of the following classes:
Texture
,Testbed
,RenderGraph
,AABB
,Rectangle
,Profiler
- Note: old bindings are still available but marked
PYTHONDEPRECATED
, with the exception ofProfiler
- Note: old bindings are still available but marked
- Cleanup
RenderGraph
bindings and write render graphs withRenderPass.create_pass
instead of free standingcreatePass
followed byaddPass
. - Remove obsolete bindings for
DeviceDesc
,SampleAppDesc
andWindowDesc
. - Add initial bindings for
Device
,Resource
,Texture
,Buffer
,CopyContext
,ComputeContext
,RenderContext
- Add initial python test that just instantiates a
Device
. - Add new
Testbed
application class for running Falcor from Python interpreter. - Automatically release Falcor python module handle using python's
atexit
infrastructure. - Allow
Testbed
to run in headless mode (enabled by default). - Add a mechanism to detect if
falcor
Python module is loaded from the embedded interpreter or not. - Attempt to load Agility SDK when using
falcor
from the Python interpreter. - Add pybind11 backport of nanobind
ndarray
class supporting both python buffer protocol anddlpack
for CPU/GPU tensor exchange.
Plugin System
- Introduces a new more generic plugin system, replacing the
RenderPassLibrary
and allowing for new plugin types. - Add
PluginManager
for loading/unloading plugins, querying plugin information and creating plugin instances. - Add
FALCOR_PLUGIN_BASE_CLASS
macro for extending a base class to be used as a plugin interface. - Add
FALCOR_PLUGIN_CLASS
macro for extending a class to be used as a plugin class. - Rename
getPasses
in render pass libraries toregisterPlugin
and use new register mechanism. - Minor adjustments in render pass libraries to make compatible with new plugin system.
- Rename cmake
add_renderpass
macro toadd_plugin
. - Always load all plugins at startup based on the
plugins/plugins.json
index file.
Cleanup Globals
- Tag globals to be removed using
// TODO: REMOVEGLOBAL
. - Remove global
gpDevice
device pointer. - Remove
Renderer
andFramework
interfaces. - Rename
Sample
toSampleApp
and refactor to not rely onRenderer
andFramework
interfaces. - Rename
SampleConfig
toSampleAppConfig
. - Remove global
gpFramework
pointer. - Remove
gMainWindowHandle
andsetMainWindowHandle
. - Convert
TextRenderer
from singleton to a normal class. - Cleanup
TextRenderer
andFont
and enableclang-format
. - Make
QueryHeap
andGpuMemoryHeap
having non-owning reference to device. - Remove global in
RenderContext
. - Remove global
createRenderGraph()
andloadRenderGraph()
in Falcor for Python. Usetestbed.createRenderGraph()
andtestbed.loadRenderGraph()
instead. - Remove global
createPass()
in Falcor for Python. UseRenderGraph.createPass()
instead. - Keep device in a
std::unique_ptr<Device>
inSampleApp
andTestbed
to better indicated ownership. - Add
SharedCache
utility class for managing shared global data. - Use
SharedCache
inFullScreenPass
. - Use
SharedCache
in to replace global SDF GPU data. - Make
Device
own theProfiler
. - Also use non-owning pointer to device in
CopyContext
/ComputeContext
/RenderContext
as the life-time of these are tied to the device. - Manage multiple
ImGui
contexts. - Add support managing a list of images in the GUI context to get rid of globals.
- Allow creating multiple
Testbed
instances. - Handle multiple GUI contexts.
- Add image caching in GUI system to remove global clock image textures.
Cleanup
- Prefer using
static constexpr
in class/struct scoped constants. - Rewrite
T const&
toconst T&
which is the prevalent convention in Falcor.
Intrusive reference counting
- Add
Object
base class for reference counted objects. - Add
ref<T>
reference counting helper to reference objects derived fromObject
. - Add
BreakableReference
type, to allow a subset of API classes to break their strong reference to theDevice
. This allows to break cyclic references and allow proper shutdown of theDevice
class when all references go out of scope. - Replace
SharedPtr
withref
. - Use new reference counted objects for all graphics API classes.
- Use
FALCOR_OBJECT
to add object class names across the code base. - Add support for object lifetime tracking and reference tracking.
- Expose dumping of alive objects in Python using
dump_alive_objects
.
Custom Vector/Matrix classes
- Remove
glm
. - Add custom vector/matrix/quaternion classes with similar semantics to HLSL/Slang:
+
,-
,*
,/
,==
and!=
are all component-wise operations.- Use
mul
to multiply vector/matrix, matrix/matrix, quaternion/quaternion or quaternion/vector. - Free standing functions for intrinsics (
dot
,cross
,min
,max
,clamp
,inverse
,transpose
etc.)
- Introduce
ScalarTypes.h
for scalar types andScalarMath.h
for math functions on scalars.- Add support for
h
half float literals.
- Add support for
- Introduce
VectorTypes.h
for vector types andVectorMath.h
for operators/functions.- Add
vector<T, N>
type and type aliases. - Replace
glm::vec
type withmath::vector
type. - Most notable difference is that all comparisons are component-wise and return a
boolX
.x == float3(1.f, 2.f, 3.f)
becomesall(x == float3(1.f, 2.f, 3.f)
x != float3(1.f, 2.f, 3.f)
becomesany(x != float3(1.f, 2.f, 3.f)
- Use
vector<>
forfloat16
vector types.
- Add
- Introduce
MatrixTypes.h
for matrix types andMatrixMath.h
for operators/functions.- Add
matrix<T, R, C>
type and type aliases. - Replace
mat4
withfloat4x4
type.
- Add
- Introduce
QuaternionTypes.h
for quaternion types andQuaternionMath.h
for operators/functions.- Add
quat<T>
quaternion type.
- Add
- Introduce
matrix::identity()
,matrix::zeros()
andquat::identity()
functions and use them where appropriate. - Add
transformVector
andtransformPoint
helper functions. - Replace
glm::
constants withM_XXX
constants. - Add unit tests.
Eums & Properties
- Introduce
Core/Enum.h
for defining enum strings:- Add
enumToString
andstringToEnum
functions to convert enums to/from strings. - Add
FALCOR_ENUM_INFO
to define enum strings. - Add
FALCOR_ENUM_REGISTER
to register enum strings for use withenumToString
andstringToEnum
.
- Add
- Automatically handle enum strings in
Dictionary
to minimize code changes. - Add a new
dropdown
function to theWidgets
class which automatically uses the registered strings in the GUI. - Replace enum python bindings for render passes with enum strings.
- Add
tools/fix_render_script.py
helper script to automatically update existing scripts (replaceEnumType.Value
with'Value'
). - Add
Properties
class for storing configuration properties. - Add
PropertiesWriter
andPropertiesReader
classes for serializing structs. - Replace
SerializableStruct
with properties archives. - Update all render passes to use
Properties
. - Update all render scripts.
- Add
flagsToStringList
andstringListToFlags
helpers for converting enum flags to/from string lists. - Cleanup unknown property warnings.
- Rename
applySettings
tosetProperties
. - Replace
RenderPass
get_properties
Python binding with read-onlyproperties
attribute plus aset_properties
method for modifying properties. - Make
RenderPass::getProperties()
const.
Graphics API
- Report GFX/D3D12 live objects on shutdown in debug builds (helps debugging clean shutdown).
- Cleanup resource format list to match what we have in
gfx
. - Add conversion to native Vulkan formats.
- Move utilities for conversion to native formats to
NativeFormats.h
(reduce d3d12/vulkan header exposure). - Add
NativeHandle
used for passing native graphics API handles. - Add support for querying both D3D12 and Vulkan native handles.
- Move D3D12 specific code into
Shared
directory (specificallyConstantBufferView
). - Remove most obsolete handle definitions in
D3D12Handles.h
. - Simplify
ResourceView
base class. - Work towards not exposing
d3d12.h
andvulkan.h
by default, only where it's actually used. - Enable shader cache by default.
- Add
Swapchain
class. - Remove implicit swapchain and framebuffer handling from
Device
. - Add mechanism for passing a shader prelude to the downstream compiler.
- Pass NVAPI search path to
dxc
. - Add
ShaderExecutionReorderingAPI
andRaytracingReordering
feature flag. - Add support for creating device on specific graphics adapter.
- Remove documentation of
FALCOR_GPU_VENDOR_ID
andFALCOR_GPU_DEVICE_ID
which are no longer supported. - Remove
FALCOR_D3D12
andFALCOR_GFX
macros. - Remove most handle types and replace with
gfx
types directly. - Use
gfx::BufferResource
andgfx::ImageResource
to reduce amount of casting. - Add device limits to remove D3D12 specific code.
- Remove global blit context.
- Merge all GFX sources in
Source/Falcor/Core/API/GFX
into the main source files inSource/Falcor/Core/API
. - Remove D3D12 backend sources in
Source/Falcor/Core/API/D3D12
. - Replace
[__unsafeForceInlineEarly]
with new[ForceInline]
. - Fix
GFXParameterBlock
to own resources that are assigned withsetBuffer
. - Fix
to_string
forShaderType
. - Check for
Device::SupportedFeatures::WaveOperations
inGFXDevice
. - Add additional
FALCOR_GFX_CALL
checks and improve logging of failures. - Replace static configuration of GFX device type with the option to set device type at runtime.
- Add runtime checks for D3D12 (
requireD3D12()
) to throw an exception not having D3D12 available. - Throw when trying to create invalid entry points on an
RtProgram
. - Pass
RenderContext
to profile calls. - Add
Device::enableAgilitySDK()
to load Agility SDK at runtime. - Add
getImage
andgetData
functions toTexture
Python API, allowing to get images as numpy arrays. - Fix depth clip flag in gfx rasterizer state.
- Disable slang conversion warnings.
- Fix hang with deferred loading of identical textures.
- Remove unnecessary GPU flush in deferred texture loading.
- Add support to load mip levels from individual files.
- Remove the
ParameterBlockSharedPtr
shared pointer wrapper. - Programs kept version history based on DefinesList as the only key. Meaning that if the conformances changed, it would pick up the wrong version. It now uses both defines and type conformances.
- Check all calls to GFX.
- Log DXGI device removed/hung/reset errors.
- Add initial NSight Aftermath support.
- Add
RGBA16Snorm
,BGRA4Unorm
andD32FloatS8Uint
resource formats. - Add missing
ITransientResourceHeap::finish()
calls to fix crashing on releasing transient buffers that are still in use. - Rename
Shader
class toEntryPointKernel
and move toCore/Program/ProgramVersion.h
. - Move
Shader::DefineList
class toCore/Program/DefineList.h
and into global namespace. - Replace
Program::DefineList
andShader::DefineList
withDefineList
. - Move
ShaderType
enum toCore/API/ShaderType.h
. - Move
Shader::CompilerFlags
enum intoProgram
class. - Move
Shader::TypeConformance
andShader::TypeConformanceList
intoProgram
class. - Remove
Shader.h
/Shader.cpp
. - Rename shader define
FALCOR_D3D
toFALCOR_D3D12
. - Rename shader define
FALCOR_VK
toFALCOR_VULKAN
.
Core
- Search paths in
Settings
are now always weakly cannonicalized. - Break into debugger if error message box is disabled.
- Add
setKeyboardInterruptHandler()
inOS.h
for setting up a callback for Ctrl-C. - Add
operator<
onfloatX
andintX
types. - Remove
postQuitMessage
function. - Fix return code handling in
SampleApp
. - Extend
SampleApp
to allow for running without creating a window/swapchain (headless mode). - Do not create FBOs for swapchain images but copy final output to swapchain image instead.
- Rename
SampleApp::onResourceSwapChain()
toSampleApp::onResize()
. - Add
Window::setWindowIcon()
function. - Disable show error message box by default.
- Introduce
settings.json
, JSON config file that allows specifying global options by placing it in~/.falcor/settings.json
.- Supports
["standardsearchpath"]
and["searchpath"]
. - Within these, supports
category = "path1;path2;&;@"
or ``category = ["path1", "path2", "&", "@"]` - The
&
gets replaced by previous value of the searchpath (useful when setting these viasetOptions
in scripts) and@
by the same category from thestandardsearchpath
. - The resulting searchpaths are stores in SampleApp's settings and obtained via
getSearchDirectories
call. - The intent is that these are set when the scene is being loaded and left as such (e.g., scenes generally shouldn't set these, and we do not expect to unset these).
- Supports
- Switch to compile-time format strings.
- Remove unused/unimplemented
getCUDADeviceAddress()
. - Remove
reportAssert
in favor of usingreportFatalError
with optionalshowStackFrame
argument. - Remove
msgBoxTitle()
andgMsgBoxTitle
global and instead take atitle
argument in themsgBox()
function. - Make various static
pNull
shared pointersconst
. - Flush output stream when logging to the console.
- Print stack trace on asserts.
- Append stack trace to exceptions.
- Minor formatting changes to assert/check messages.
- Extend
ImGui
key mapping to support all keys. - Show/focus window when created, not when msg loop is run.
- Add
FALCOR_CHECK_ARG
family of macros for checking arguments, which assert when asserts are enabled and throw otherwise. - Add
getRuntimeDirectory()
which returns the runtime directory whereFalcor.dll
orlibFalcor.so
is located. - Replace calling
getExecutableDirectory()
withgetRuntimeDirectory()
in most places. - Make all functions returning paths thread-safe.
- Include
windef.h
instead ofwindows.h
inPlatformHandles.h
to improve compilation time. - Stop using
findFileInDataDirectories
in places where it's not required and instead use the provided path as-is (relative to working directory, or absolute path). - Refactor
ProgressBar
to be an object (get rid of globals), it's now a member inSampleApp
. - Reduce usage of
stringstream
and remove obsoletesstream
includes. - Move
ComputePass
,RasterPass
etc. fromRenderGraph/BasePasses
toCore/Pass
. - Remove
RasterScenePass
(migrateHelloDXR
to useRasterPass
instead). - Add
logWarningOnce
andlogErrorOnce
to allow deduplicating error messages. Intended to prevent spamming the log when a Hydra mesh is broken in multiple ways. - Rename
Dictionary
toPythonDictionary
, making it's dependency to Python more explicit. - Remove
SerializableStruct
python binding helper. - Add local bindings to
SceneRenderSettings
bindings (will become obsolete in the future anyway). - Add global settings accessible by
Settings::getGlobalSettings()
. - Add Python bindings to
Logger
class and allow to set logfile path at runtime.
Scene
- Add texture stats for average number of channels per texel.
- Disable subdivision for meshes with skinning.
- Fix
int2
compare function inScene::createMeshUVTiles()
. - Fix missing
vbOffset
when loading vertices from global vertex buffer. - Add a way for
Scene
to return a list ofGlobalGeometryID
s bound to a given material. - Add a way for
Scene
to return a an array ofRectangle
s spanned by the givenGlobalGeometryID
. - Add additional scene update flags to notify users of shader code changes.
- Add
Scene
update flagSceneDefinesChanged
to indicate when defines change. - Remove functions for getting default scene defines.
- Refactor
Scene
to prepare for dynamic materials. - Add support for re-using GridSequences, which allows GridVolumes to be instanced.
- Add support for specifying initial grid volume index for playback.
- Increase
MaterialHeader
size to 16B and addIoR
value.
Importers
- It is now possible to set options and attributes in pyscene files. This is scoped to the given
pyscene
file and all files it loads, but does not propagate up. - Move asset importers from core
Falcor
library to individual importer plugins. - Remove dependency to
nv-usd
from coreFalcor
library. - Remove the
instances
parameter onimport
. This was only ever supported forAssimpImporter
and probably not used in a long time. - Pass the
Settings
instead of accessing the globalgpFramework
pointer which we want to remove. - Minor improvement to handle URIs in GLTF texture paths, improving loading assets from Path Tracing SDK.
- Use
pybind11::dict
instead ofDictionary
onImporter::importScene
. - Add interfaces for loading pyscene from memory.
USDImporter
- Fix issue that could cause dereference of a null primvar on meshes with no texture coordinates.
- Add support for instanced curves.
- Initial support for subdivided meshes in
USDImporter
, courtesy ofOpenSubdiv
. - Match USD texture coordinate primvars by type (
texCoord2f
, etc.) or by name. - Fixes missing texture coordinates on assets exported from certain DCC apps.
- Use OpenSubdiv::Bfr to perform refinement. Remove Hydra dependency.
Materials
- Cleanup comments and unused imports in BSDFs/materials.
- Rename
SpecularMicrofacetBTDF
toSpecularMicrofacetBSDF
. - Move
ShadingFrame
to its own module. - Store the smooth shading frame (TBN vectors) as a
ShadingFrame
inShadingData
. - Cleanup handling of shading frames and add helpers.
- Remove unused
applyNormalMap()
function (missed in previous MR). - Switch to using separate BSDF modules for
StandardMaterial
. - Remove legacy
BxDF.slang
. - Do not call
adjustShadingNormal()
from the rendering code. - Add calls to
adjustShadingNormal()
in the material instance setup for all materials that didn't already have this. - Do not automatically flip the shading normal stored in
ShadingData
. - Move normal mapping into setup for
StandardMaterial
. - Remove
IMaterial::modifyTangentSpace
interface that is no longer needed. - Add hemisphere checks to transmissive PBRT materials.
- Use the geometric normal for NEE in the path tracers.
- Use guide normal for remaining parts of NRD.
- Fix
StandardMaterial::getExtraBSDFProperties()
to output shading frames in local space. - Fix shading normal adjustment to preserve orientation of the shading normal.
- Add hemisphere checks to coated PBRT materials.
- Add hemisphere checks to
StandardMaterial
. - Add full hemisphere checks to all reflective, non-layered materials.
- Add backfacing checks to
PBRTDiffuseMaterial
. - Add image test for light leaks due to normal mapping.
- Add
MaterialInstanceHints
to control how materials apply normal mapping and/or shading normal adjustment. - Move normal mapping into material instance setup for most materials.
- Add MERL mixture material (
MERLMixMaterial
). - Add helpers for hemisphere checks.
- Move functionality for loading a MERL BRDF and associated data into utility
MERLFile
. - Texture statistics are now gathered from the
TextureManager
, rather than from the Materials. - Add importance sampling to
MERLMaterial
using fitted diffuse-specular BRDF. - Add
DiffuseSpecularBRDF
for sampling purposes. - Move helper for detecting normal mapping type to the
Material
base class. - Add
ShadingFrame
stored internally in each material instance. - Add
MaterialInstanceHints
parameter to thesetupMaterialInstance
interface to allow controlling its behavior (currently no hints). - Move
tangentW
holding the interpolated tangent and sign intoShadingData
for use in orthogonalization. - Increase default max size of
IMaterialInstance
to 128B. - Add
ShadingFrame
utility for holding an orthonormal TBN frame. - Add utilities for computing a
ShadingFrame
due to normal mapping and normal adjustment (bent normals). - Add mechanism for
IMaterialInstance
to report a feature guide normal viaBSDFProperties
. - Add
guideNormal
output toGBufferRT
andGBufferRaster
. - Update
GBufferRT.normWRoughnessMaterialID
output to use the guide normal. - Update
GBufferRaster.pnFwidth
output to use the guide normal. - Add primitive support to all BSDFs to query their roughness.
IMaterial
can now returnVolumeProperties
viagetHomogeneousVolumeProperties
for programmable homogeneous materials, with multiple phase functions.- All materials now inherit from
MaterialDefaultImplementation
, that provides default implementations for thegetHomogeneousVolumeProperties
call. - Add a thinwalled dielectric BSDF.
- Pull out IOR flip from
PBRTDielectricBSDF
and into its material instance. - When more textures are loaded than
MaterialSystem
has descriptors for, the error reports both numbers. TextureManager
can now report how many textures it actually loaded (for UDIMs).TextureManager
now supports looking for textures in caller-supplied directories, rather than data directories.- The
MaterialSystem
andTextureManager
now support UDIMs. Material::update
is now called before creating aMaterialSystem
parameter block and separate from theuploadMaterial
.- Split up the microfacet code into separate files:
IsotropicGGX.slang
: used throughout most of Falcor, including the speed-of-lightStandardMaterial
.Microfacet.slang
: general interface, to be used throughout material refactors.
- Work on microfacet distributions:
- Add generalized interface for microfacet distributions.
- Add Trowbridge-Reitz (GGX) & Beckmann-Spizzichino NDFs adhering to general microfacet interface.
- Elliptical anisotropy (alphaX, alphaY + rotation).
- Typical microfacet functions (
D
,pdfAll
,visibleD
,G1
,G2
,sampleAll
,sampleVisible
). - More specialized functions used in multiscatter random walks (
sigma
,Lambda
).
- Split the BSDF unit tests so each BSDF has its own test.
- Disabled the
TestBsdf_SpecularReflectionTransmissionMicrofacet
as it is failing (pending microfacet refactor) - Add interface for materials to set shader defines.
- Make registered material type names unique.
- Add
replaceMaterial
toSceneBuilder
andMaterialSystem
for allow to replace existing materials. - Add
diffuseAlbedoMultiplier
material override toRenderSettings
and handle inStandardMaterial
andClothMaterial
. - Rename
IBxDF
intoIBSDF
. - Refactor
MaterialSystem
to allow adding materials at runtime. - Rename
IBSDF
intoIMaterialInstance
. - Rename
Lobe
intoLobeType
where applicable. - Add
sampleNext4D
helper function. - Change
int Material::getBufferCount() const
tosize_t Material::getMaxBufferCount() const
. - Change
size_t Material::getMaterialInstanceByteSize()
tosize_t Material::getMaterialInstanceByteSize() const
. - Add managed 3D textures to
MaterialSystem
.
Volumes
- Add
DualHenyeyGreensteinPhaseFunction
phase function.
Utils
- Improve
formatByteSize
output and add tests. - Add
replaceCharacters
helper function inStringUtils
. - Add
UnionFind
utility. - Add
Rectangle
type that acts as a 2D AABB. - Add
LockFile
helper class for inter-process file locks. - Add
MemoryMappedFile
utility class for accessing files through memory mapping. - Add basic operators to
float16_t
type. - Add
spherical_to_cartesian_rad
utility (inverse ofcartesian_to_spherical_rad
) and unit test. - Add
sample_hemisphere
utility. - Add helper functions for handling search paths.
- Remove legacy
ParallelReduction
class. - Rename
ComputeParallelReduction
toParallelReduction
. - Change
getEnvironmentVariable
to returnstd::optional<string>
. - Add
findFileInDirectories
andglobFilesInDirectories
to look and glob in user provided directories. - Convert
std::filesystem::path
to string when writing toDictionary
. - Add warp profiling utilities (see
WarpProfiler
). - Add unit tests for warp profiling tools.
- Add utility class
BufferAllocator
for managing sub-allocations and updates of GPU buffers. - Add unit tests for
BufferAllocator
interfaces. - Add utility function to convert string to lower case.
- Fix alignment in
AlignedAllocator
and update test. - Add utility functions to
SHA1
. - Rename
Properties
toSettingsProperties
. - Fix 2x2 matrix inversion.
- Memory mapped image loading in
Bitmap
andImageIO
. - Make
Console
not be a singleton, it's now a member inSampleApp
. - Remove shared globals in
ImageProcessing
. Resources are now created per instance (we can cache it at the caller if necessary). - Fix
Profiler
singleton to be thread-safe. - Change
FrameRate::getAverageFrameTime
to return time in seconds and cleanup string formatting. - Take into account scaling factor for GUI window size.
- Add
decodeURI
string utility. - Move/extend
CudaUtils
helpers fromOptixDenoiser
intoUtils/
.
Rendering
- Extend
SampleGenerator
CPU interface withrenderUI
,beginFrame
andendFrame
methods. - Fix setting environment map sampler when creating pdf texture.
Renderpasses
- Extend
SceneDebugger
to show the fields ofShadingData
for the selected pixel. - Add support for running DLSS on Vulkan.
- Fix bug that
GBufferRT
wasn't clearing all outputs on miss. - Remove some obsolete
register
specifiers in shaders (get rid of slang warnings). - Serialize
maxFrameCount
andoverflowMode
inAccumulatePass
. - Change convention for G-buffer tangent to store original geometric tangent (not orthogonalized to the normal).
- Refactor
AccumulatePass
options:- Remove
maxAccumulatedFrames
option. - Remove
subFrameCount
option. - Add
maxFrameCount
andoverflowMode
options. - Add overflow modes
Stop
,Reset
andEMA
to control what happens after themaxFrameCount
(if not 0) is reached.
- Remove
- Add
antiFlicker
option toTAA
pass. - Remove obsolete manual loading of render pass libraries in render scripts.
- Rename
mRTXGIContextParams
tomRTXDIContextParams
. - Make the depth pre pass part of the
GBufferRaster
render pass. - Add
RenderGraph::createFromFile
to load render graph python scripts. - Remove the obsolete
getProjDir
from render passes. - Add
outputFormat
property toBlitPass
. - Cleanup
RenderPassLibrary
singleton and remove disabled hot reloading support. - Rename
PathTracer.normal
output toPathTracer.guideNormal
and use the guide normal for computing it. - Throw when creating
RenderGraph
with nogpDevice
available. - Add
CrossFade
pass for time-dependent fading between two inputs. - Cleanup and add additional visualization modes to
SceneDebugger
. - Add mask output to
VBuffer
.
Mogwai
- Add
--fullscreen
flag to start in fullscreen mode. - Add
--headless
flag to run in headless mode (used for image tests). - Add
--list-adapters
and--adapter-index
flags for selecting the GPU adapter. - Add
-d,--device-type
flag for selecting the graphics API. - Rename
resizeSwapChain
toresizeFrameBuffer
in Mogwai's Python API and adjust render scripts (resizeSwapChain
is still available but deprecated).
Testing
- Use argument forwarding in unit test runner. No longer need to mimick
FalcorTest
's arguments in the test runner. - Add simple barebones python test runner with a single dummy test and support for writing JUint XML reports.
- Remove functionality to build Falcor from the test runners (was broken anyway).
- Extend test runners to autodetect the latest build config.
Unit Tests
- Change
FalcorTest
to run in headless mode. - Add
--list-adapters
and--adapter-index
flags toFalcorTest
for selecting the GPU adapter. - Add
-d,--device-type
flag toFalcorTest
for selecting the graphics API. - Abort when Ctrl-C is detected.
- Add
cpu
andgpu
categories. - Add a unit test for
Bitmap
. - Fix issue with
*TestException
on Linux. - Add unit test for resource aliasing.
- Cleanup unit test reporting.
- Messages are only printed once (printed to std::cout only if logger does not print them).
- Failures are now printed right away when they fail, rather than waiting until the whole test ends.
- Skip exception no longer prints stack trace.
- Add new EXPECT macros with easier to read formatting.
- Add new ASSERT macris, to abort the test if an invariant would cause the rest of the test to be nonsensical/crashing.
- Add unit tests for buffer update and map functionality.
- Add unit tests for microfacet sampling.
- Move most of the unit testing code into
unittest
namespace. - Introduce optional arguments to
CPU_TEST
andGPU_TEST
macros to configure tests:- skip messages
- tagging
- device types to run on
- Remove
GPU_TEST_D3D12
andGPU_TEST_VULKAN
macros (we can now use the optional arguments). - Refactor
FalcorTest
application to not useSampleApp
. - Add a separate enumeration and filter stage.
- Introduce separate test suite and case filters.
- Write XML report file with proper test suites.
- Remove
unittest::CategoryFlags
. - Add
--list-test-suites
,--list-test-cases
and--list-tags
options toFalcorTest
. - Add
-t
,--tags
option toFalcorTest
for filtering on tags. - Add experimental parallel runner for unit tests.
- Replace unit test
mapBuffer
/unmapBuffer
with faster/saferreadBuffer
. - Optimize performance of
SampleGeneratorTests
. - Fix
LockFileTests
to run in parallel. - Add support for running unit tests on multiple devices (device types) in a single run.
- Make
PseudorandomTests
re-entrant. - Add
endFrame()
after running each unit test to cleanup resources.
Image Tests
- Extend image tests to allow running on both D3D12 and Vulkan.
- Reduce default image test resolution to
640x360
. - Enable a few simple image tests to run on Vulkan (
ColorMapPass
,CompositePass
,SideBySide
,ToneMapping
). - Add image test wrapper script for Linux.
- The
report.json
coming from image tests now contains the cwd and args passed to Mogwai, used to run that test. It is in the form that can be directly used with VSCode'slaunch.json
.