82 node.
origin = (aabbMax + aabbMin) * 0.5f;
83 node.
extent = (aabbMax - aabbMin) * 0.5f;
94 node.
header = rightChildIdx;
104 extent = std::max(extent, 0.0f);
113 if (length(direction) <= 1e-12f)
115 direction /= std::abs(direction.x) + std::abs(direction.y) + std::abs(direction.z);
116 float2 oct = direction.z >= 0.0f
118 : (
float2(1.0f) - abs(direction.yx())) * sign(direction.xy() +
float2(1e-6f));
119 uint32_t x =
static_cast<uint16_t
>(
quantizeSnorm(oct.x, 16));
120 uint32_t y =
static_cast<uint16_t
>(
quantizeSnorm(oct.y, 16));
121 return x | (y << 16u);
126 int16_t x =
static_cast<int16_t
>(packed & 0xffffu);
127 int16_t y =
static_cast<int16_t
>(packed >> 16u);
128 float2 oct = clamp(
float2(
static_cast<float>(x),
static_cast<float>(y)) * (1.0f / 32767.0f),
130 float3 normal(oct, 1.0f - std::abs(oct.x) - std::abs(oct.y));
131 float2 xy = normal.z >= 1e-6f
133 : (
float2(1.0f) - abs(oct.yx())) * sign(oct +
float2(1e-6f));
134 return normalize(
float3(xy.x, xy.y, normal.z));
141 packed.data[1] = std::bit_cast<uint32_t>(node.
origin.x);
142 packed.data[2] = std::bit_cast<uint32_t>(node.
origin.y);
143 packed.data[3] = std::bit_cast<uint32_t>(node.
origin.z);
147 float angle = std::clamp(node.
cosConeAngle, -1.0f, 1.0f);
152 float directionError = std::acos(std::clamp(dot(normalize(node.
coneDirection), decodedDirection), -1.0f, 1.0f));
153 float widenedAngle = std::min(std::acos(angle) + directionError, std::numbers::pi_v<float>);
154 angle = widenedAngle < std::numbers::pi_v<float> ? std::cos(widenedAngle)
157 uint32_t packedAngle =
static_cast<uint32_t
>((angle + 1.0f) * 32767.0f);
158 packed.data[4] = extentX | (extentY << 16u);
159 packed.data[5] = extentZ | (packedAngle << 16u);
160 packed.data[6] = packedDirection;
161 packed.data[7] = std::bit_cast<uint32_t>(node.
flux);
169 node.origin =
float3(std::bit_cast<float>(packed.
data[1]), std::bit_cast<float>(packed.
data[2]),
170 std::bit_cast<float>(packed.
data[3]));
174 node.cosConeAngle =
static_cast<float>(packed.
data[5] >> 16u) * (1.0f / 32767.0f) - 1.0f;
176 node.flux = std::bit_cast<float>(packed.
data[7]);
239 float colorWeight = (std::abs(light.
color.x) + std::abs(light.
color.y) + std::abs(light.
color.z)) / 3.0f;
240 float radiometricWeight = std::max(0.0f, light.
power) * colorWeight;
244 return radiometricWeight;
248 return radiometricWeight * light.
params.y * std::numbers::pi_v<float>;
251 return radiometricWeight * (4.0f * std::numbers::pi_v<float>);
254 float cosInner = std::clamp(std::max(light.
params.y, light.
params.z), -1.0f, 1.0f);
255 float cosOuter = std::clamp(std::min(light.
params.y, light.
params.z), -1.0f, cosInner);
256 float solidAngle = 2.0f * std::numbers::pi_v<float> *
257 ((1.0f - cosInner) + (cosInner - cosOuter) / 5.0f);
258 return radiometricWeight * solidAngle;
263 ? std::numbers::pi_v<float> * light.
params.x * light.
params.y
264 : 4.0f * length(cross(light.
dpdu, light.
dpdv));
265 float sides = (light.
flags & to_integer(GSLightFlagsBits::TwoSided)) != 0u ? 2.0f : 1.0f;
266 return radiometricWeight * area * std::numbers::pi_v<float> * sides;
272 float3& coneDirection,
float& cosConeAngle);
void LightBVHNodeSetLeaf(LightBVHNode &node, uint32_t lightCount, uint32_t lightOffset)
Definition LightBVH.hpp:97
bool LightBVHNodeIsLeaf(LightBVHNode const &node)
Definition LightBVH.hpp:60
void LightBVHNodeSetInternal(LightBVHNode &node, uint32_t rightChildIdx)
Definition LightBVH.hpp:92
LightBVHNode UnpackLightBVHNode(GSLightBVHNode const &packed)
Definition LightBVH.hpp:165
LightBVHBuild BuildLightBVH(Span< GSLight const > lights, Span< GSEmissiveCluster const > clusters, LightBVHOptions const &options, Allocator *alloc)
Definition LightBVH.cpp:693
bool IsDistantLightType(uint32_t type)
Definition LightBVH.hpp:221
uint32_t PackLightBVHConeDirection(float3 direction)
Definition LightBVH.hpp:111
float3 UnpackLightBVHConeDirection(uint32_t packed)
Definition LightBVH.hpp:124
GSLightBVHNode PackLightBVHNode(LightBVHNode const &node)
Definition LightBVH.hpp:137
uint32_t LightBVHNodeLightOffset(LightBVHNode const &node)
Definition LightBVH.hpp:75
LightBVHSplitHeuristic
Definition LightBVH.hpp:27
constexpr float kLightBVHMinSunAngularRadius
Definition LightBVH.hpp:24
uint32_t LightBVHNodeRightChild(LightBVHNode const &node)
Definition LightBVH.hpp:65
constexpr uint32_t kLightBVHLeafBit
Definition LightBVH.hpp:23
constexpr uint32_t kLightBVHMaxLightsPerLeaf
Definition LightBVH.hpp:21
bool HasLightEmission(GSLight const &light)
Definition LightBVH.hpp:232
uint32_t LightBVHNodeLightCount(LightBVHNode const &node)
Definition LightBVH.hpp:70
void LightBVHNodeSetAABB(LightBVHNode &node, float3 const &aabbMin, float3 const &aabbMax)
Definition LightBVH.hpp:80
void ComputeAnalyticalLightBounds(GSLight const &light, float3 &aabbMin, float3 &aabbMax, float3 ¢er, float3 &coneDirection, float &cosConeAngle)
Definition LightBVH.cpp:627
constexpr uint32_t kLightBVHMaxLightOffset
Definition LightBVH.hpp:22
uint16_t PackLightBVHExtent(float extent)
Definition LightBVH.hpp:102
constexpr float kLightBVHInvalidCosConeAngle
Definition LightBVH.hpp:17
void LightBVHNodeGetAABB(LightBVHNode const &node, float3 &aabbMin, float3 &aabbMax)
Definition LightBVH.hpp:86
bool ValidateLightBVH(LightBVHBuild const &bvh, Span< GSLight const > lights, Span< GSEmissiveCluster const > clusters, String *outError=nullptr)
Definition LightBVH.cpp:815
constexpr uint32_t kLightBVHMaxDepth
Definition LightBVH.hpp:18
uint32_t GSLightTypeCPU(GSLight const &light)
Definition LightBVH.hpp:216
constexpr uint32_t kLightBVHLightCountBits
Definition LightBVH.hpp:19
float ComputeLightProposalWeight(GSLight const &light)
Definition LightBVH.hpp:237
bool IsFiniteLightType(uint32_t type)
Definition LightBVH.hpp:226
constexpr uint32_t kLightBVHLightOffsetBits
Definition LightBVH.hpp:20
bool LightBVHRunBuilderSelfTests(Allocator *alloc, String *outError=nullptr)
Definition LightBVH.cpp:1027
constexpr uint32_t kGSLightTypeDisk
Definition GPUScene.hpp:34
constexpr uint32_t kGSLightTypeEnvironment
Definition GPUScene.hpp:30
constexpr uint32_t kGSLightTypeMask
Definition GPUScene.hpp:29
constexpr uint32_t kGSLightTypeDirectional
Definition GPUScene.hpp:31
constexpr uint32_t kGSLightTypeSpot
Definition GPUScene.hpp:33
constexpr uint32_t kGSLightTypeRect
Definition GPUScene.hpp:35
constexpr uint32_t kGSLightTypePoint
Definition GPUScene.hpp:32
Allocator interface (noexcept)
Definition Allocator.hpp:29
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
std::basic_string< char, std::char_traits< char >, StlDefaultAllocator< char > > String
Alias for std::basic_string<char>, without an explicit allocator constructor.
Definition Container.hpp:120
std::span< T > Span
Alias for std::span
Definition Container.hpp:62
vec2 float2
Definition Math.hpp:27
float dequantizeFP16(unsigned short h)
Definition Quantize.cpp:54
int32_t quantizeSnorm(float v, int32_t N)
Definition Quantize.hpp:48
vec3 float3
Definition Math.hpp:26
unsigned short quantizeFP16(float v)
Definition Quantize.cpp:10
Definition Allocator.hpp:6
Definition LightBVH.hpp:55
uint32_t data[8]
Definition LightBVH.hpp:56
Definition GPUScene.hpp:131
float3 dpdu
Definition GPUScene.hpp:140
float3 dpdv
Definition GPUScene.hpp:141
float power
Definition GPUScene.hpp:134
float4 params
Definition GPUScene.hpp:139
float3 color
Definition GPUScene.hpp:133
uint32_t flags
Definition GPUScene.hpp:132
Definition GPUScene.hpp:40
Definition LightBVH.hpp:194
bool valid
Definition LightBVH.hpp:207
Vector< LightBVHRefitLevel > refitLevels
Definition LightBVH.hpp:202
uint32_t finiteLightIndexCount
Definition LightBVH.hpp:206
Vector< GSLightBVHNode > gpuNodes
Definition LightBVH.hpp:197
Vector< uint32_t > lightIndices
Definition LightBVH.hpp:198
Allocator * allocator
Definition LightBVH.hpp:195
uint32_t distantRootNode
Definition LightBVH.hpp:204
LightBVHBuild(Allocator *alloc)
Definition LightBVH.hpp:209
LightBVHStats stats
Definition LightBVH.hpp:203
uint32_t distantNodeCount
Definition LightBVH.hpp:205
Vector< uint64_t > lightBitmasks
Definition LightBVH.hpp:199
Vector< uint32_t > nodeIndices
Definition LightBVH.hpp:201
Vector< LightBVHNode > nodes
Definition LightBVH.hpp:196
Vector< uint32_t > globalLightIndices
Definition LightBVH.hpp:200
Definition LightBVH.hpp:45
float3 coneDirection
Definition LightBVH.hpp:50
float3 extent
Definition LightBVH.hpp:48
float flux
Definition LightBVH.hpp:49
uint32_t header
Definition LightBVH.hpp:46
float3 origin
Definition LightBVH.hpp:47
float cosConeAngle
Definition LightBVH.hpp:51
Definition LightBVH.hpp:34
bool useVolumeOverSA
Definition LightBVH.hpp:39
uint32_t binCount
Definition LightBVH.hpp:36
bool splitAlongLargest
Definition LightBVH.hpp:38
LightBVHSplitHeuristic splitHeuristic
Definition LightBVH.hpp:35
float volumeEpsilon
Definition LightBVH.hpp:37
bool useLightingCones
Definition LightBVH.hpp:41
bool usePreintegration
Definition LightBVH.hpp:40
Definition LightBVH.hpp:183
uint32_t byteSize
Definition LightBVH.hpp:186
uint32_t treeHeight
Definition LightBVH.hpp:184
uint32_t globalLightCount
Definition LightBVH.hpp:190
uint32_t leafNodeCount
Definition LightBVH.hpp:188
uint32_t minDepth
Definition LightBVH.hpp:185
uint32_t finiteLightCount
Definition LightBVH.hpp:189
uint32_t internalNodeCount
Definition LightBVH.hpp:187