Vulkan Schnee 0.0.1
High-performance rendering engine
Loading...
Searching...
No Matches
RenderData.h
Go to the documentation of this file.
1#pragma once
2#include <array>
3#include <cstddef> // for offsetof
4#include <glm/mat4x4.hpp>
5#include <vector>
6
7#include "GpuDataLayouts.hpp"
8
9namespace Engine::Rendering
10{
11 // ============================================================================
12 // CPU-Side Data Structures
13 // ============================================================================
14
27
32 {
33 glm::mat4 modelMatrix;
34 std::vector<CpuPrimitiveData> primitives;
35 };
36
37 // Forward declaration for GPU buffer structs
38 namespace GpuBuffers {
39 struct UnifiedMeshlet;
40 }
41
46 {
47 std::vector<GpuBuffers::UnifiedMeshlet> meshletData;
48 uint32_t textureIndex = 0u;
49 std::vector<uint32_t> vertices;
50 std::vector<uint8_t> tris;
51 };
52
57 {
60 uint32_t meshletCount;
63 uint32_t vsIndexOffset;
64 uint32_t vsIndexCount;
66 uint32_t pipelineIndex;
69 bool hasLodData = false;
71 uint32_t boneCount = 0;
72 };
73
78 {
79 std::array<glm::vec4, 6> planes[2];
80 };
81
82 // ============================================================================
83 // GPU Buffer Data Structures (must match GLSL layouts)
84 // ============================================================================
85
86 namespace GpuBuffers
87 {
91 struct Dispatch
92 {
93 uint32_t groupSizeX = 0u;
94 uint32_t groupSizeY = 0u;
95 uint32_t groupSizeZ = 0u;
96 };
97
102 {
103 uint32_t meshletCount = 0u;
104 uint32_t offset = 0u;
105 };
106
110 struct alignas(16) UnifiedMeshlet
111 {
112 uint32_t vertexCount;
120 uint32_t _padding[2]{};
121 };
122 static_assert(sizeof(UnifiedMeshlet) == 48, "UnifiedMeshlet size mismatch");
123
131 {
132 glm::vec4 worldPositionAndRadius; // xyz = world position, w = radius
133 uint32_t meshletIndex = 0;
134 uint32_t pipelineIndex = 0;
135 };
136
141 {
143 uint32_t materialId;
144 uint32_t shProbeIndex = 0;
145 uint32_t _padding = 0;
146 };
147
154 {
156 uint32_t objectIndex;
157 uint32_t _padding[3];
158 };
159
166 {
168 };
169
174 {
177 uint32_t meshletCount;
178 uint32_t pipelineID;
179 uint32_t _padding;
180 };
181 static_assert(sizeof(PrimitiveMeshletData) == 24, "PrimitiveMeshletData size mismatch");
182
187 {
188 uint32_t meshStartIndex;
189 uint32_t meshletCount;
190 uint32_t objectIndex;
191 };
192
197 {
199 uint32_t objectID;
200 uint32_t meshletIndex;
202 uint32_t _padding;
203 };
204 static_assert(sizeof(VisibleMeshletInfo) == 24, "VisibleMeshletInfo size mismatch");
205
210 {
211 uint32_t objectIndex;
213 uint32_t meshletCount;
214 uint32_t _padding;
215 };
216
221 {
222 uint32_t objectCount;
224 };
225
246 static_assert(sizeof(MeshGeometryData) == 48, "MeshGeometryData size mismatch");
247
252 {
253 glm::mat4 worldMatrix;
254 uint32_t meshGeometryId;
255 uint32_t materialId;
257 uint32_t _padding;
258 };
259
264 {
266 uint32_t instanceId;
267 uint32_t meshGeometryId;
268 uint32_t _padding[2]{};
269 };
270
275 {
276 uint32_t indexCount;
277 uint32_t firstIndex;
280 };
281
282 // ============================================================================
283 // GPU Material Data Structures (must match GLSL std430 layout)
284 // ============================================================================
285
291 struct alignas(16) DiffuseFlatColorMaterial
292 {
293 glm::vec3 color;
294 float _padding;
295 };
296 static_assert(sizeof(DiffuseFlatColorMaterial) == 16, "DiffuseFlatColorMaterial size mismatch");
297
303 struct alignas(16) DiffuseShaderMaterial
304 {
306 float _padding1[3];
308 };
309 static_assert(sizeof(DiffuseShaderMaterial) == 32, "DiffuseShaderMaterial size mismatch");
310 static_assert(offsetof(DiffuseShaderMaterial, baseColorFactor) == 16, "baseColorFactor must be at offset 16");
311
317 struct alignas(16) PbrMaterial
318 {
323
325
326 glm::vec3 emissiveFactor;
328
331 float sh_scale;
333
334 uint32_t debug_mode;
335 uint32_t tone_mapping;
337 uint32_t hasLightmap;
338
340 float exposure;
341 uint32_t normalMapBC5;
342 uint32_t _padding[1];
343 };
344 static_assert(sizeof(PbrMaterial) == 96, "PbrMaterial size mismatch with GLSL std430 layout");
345 static_assert(offsetof(PbrMaterial, baseColorFactor) == 16, "baseColorFactor must be at offset 16");
346 static_assert(offsetof(PbrMaterial, emissiveFactor) == 32, "emissiveFactor must be at offset 32 (16-byte aligned for std430 vec3)");
347
351 struct alignas(16) NormalsMaterial
352 {
353 uint32_t debug;
354 uint32_t _padding[3];
355 };
356 static_assert(sizeof(NormalsMaterial) == 16, "NormalsMaterial size mismatch");
357
358 // ============================================================================
359 // GPU Lighting Data Structures
360 // ============================================================================
361
367 struct alignas(16) SHProbeData
368 {
369 glm::vec4 coefficients[9];
370 float scale;
372 float _padding0 = 0.0f;
373 uint32_t _padding1 = 0u;
374 };
375 static_assert(sizeof(SHProbeData) == 160, "SHProbeData size mismatch");
376
377 constexpr uint32_t MAX_DYNAMIC_POINT_LIGHTS = 64;
378
384 struct alignas(16) DynamicPointLight
385 {
386 glm::vec4 positionRadius{0.0f};
387 glm::vec4 colorIntensity{0.0f};
388 };
389 static_assert(sizeof(DynamicPointLight) == 32, "DynamicPointLight size mismatch");
390
394 struct alignas(16) DynamicPointLightBuffer
395 {
396 uint32_t pointLightCount = 0;
397 uint32_t _padding[3]{};
398 std::array<DynamicPointLight, MAX_DYNAMIC_POINT_LIGHTS> pointLights{};
399 };
400 static_assert(sizeof(DynamicPointLightBuffer) == 16 + MAX_DYNAMIC_POINT_LIGHTS * sizeof(DynamicPointLight),
401 "DynamicPointLightBuffer size mismatch");
402
408 struct alignas(16) SunLightBuffer
409 {
410 glm::vec4 directionEnabled{0.0f, -1.0f, 0.0f, 0.0f};
411 glm::vec4 colorIntensity{1.0f, 1.0f, 1.0f, 0.0f};
412 glm::vec4 shadowParams{0.0f};
413 glm::vec4 lightmapShadowParams{1.0f, 0.0f, 0.0f, 0.0f};
414 };
415 static_assert(sizeof(SunLightBuffer) == 64, "SunLightBuffer size mismatch");
416
417 constexpr uint32_t MAX_SUN_SHADOW_CASCADES = 4u;
418
422 struct alignas(16) SunShadowCascadeBuffer
423 {
424 std::array<glm::mat4, MAX_SUN_SHADOW_CASCADES> lightViewProj{};
425 glm::vec4 cascadeSplits{0.0f};
426 glm::vec4 params{0.0f};
427 glm::vec4 biasParams{0.0f};
428 glm::vec4 cameraForward{0.0f};
429 };
430 static_assert(sizeof(SunShadowCascadeBuffer) == 320, "SunShadowCascadeBuffer size mismatch");
431
432 // ============================================================================
433 // LOD (Level of Detail) Data Structures
434 // ============================================================================
435
442 {
444 float error;
446 uint32_t meshletIndex;
447 int32_t groupId;
449 uint32_t _padding[2]{};
450 };
451 static_assert(sizeof(ClusterLodData) == 48, "ClusterLodData size mismatch");
452
459 {
462 int32_t depth;
463 uint32_t _padding[2];
464 };
465 static_assert(sizeof(ClusterGroupData) == 32, "ClusterGroupData size mismatch");
466
473 {
477 uint32_t ditherEnabled;
478 glm::vec4 cameraPosition;
479 glm::vec2 screenSize;
480 glm::vec2 _padding;
481 };
482 static_assert(sizeof(LodConfigUBO) == 48, "LodConfigUBO size mismatch");
483
490 {
491 uint32_t primitiveID;
492 uint32_t clusterIndex;
494 uint32_t _padding;
495 };
496 static_assert(sizeof(ClusterSurvivor) == 16, "ClusterSurvivor size mismatch");
497
504 {
505 uint32_t primitiveID;
507 uint32_t clusterCount;
508 uint32_t meshGeometryId;
509 };
510 static_assert(sizeof(VisibleLodPrimitive) == 16, "VisibleLodPrimitive size mismatch");
511
512 } // namespace GpuBuffers
513
514 // ============================================================================
515 // Backwards Compatibility Aliases (TODO: Remove after migration)
516 // ============================================================================
517
533
534 // Material data aliases (old Gpu*Material names)
539
540 // Lighting data aliases
546
547 // LOD data aliases
554
555} // namespace Engine::Rendering
constexpr uint32_t MAX_SUN_SHADOW_CASCADES
Definition RenderData.h:417
constexpr uint32_t MAX_DYNAMIC_POINT_LIGHTS
Definition RenderData.h:377
GpuBuffers::MeshGeometryData MeshGeometryData
Definition RenderData.h:529
GpuBuffers::ObjectCullingData ObjectCullingData
Definition RenderData.h:522
GpuBuffers::ClusterSurvivor ClusterSurvivor
Definition RenderData.h:551
GpuBuffers::MeshletBounds MeshletBounds
Definition RenderData.h:520
GpuBuffers::GpuMeshDescription GpuMeshDescription
Definition RenderData.h:518
GpuBuffers::LodConfigUBO LodConfigUBO
Definition RenderData.h:550
GpuBuffers::ClusterLodData ClusterLodData
Definition RenderData.h:548
GpuBuffers::VisibleLodPrimitive VisibleLodPrimitive
Definition RenderData.h:552
GpuBuffers::DynamicPointLightBuffer DynamicPointLightBuffer
Definition RenderData.h:543
GpuBuffers::Dispatch Dispatch
Definition RenderData.h:553
GpuBuffers::DynamicPointLight DynamicPointLight
Definition RenderData.h:542
GpuBuffers::ObjectCullingCounters ObjectCullingCounters
Definition RenderData.h:528
GpuBuffers::DiffuseShaderMaterial GpuDiffuseShaderMaterial
Definition RenderData.h:536
GpuBuffers::NormalsMaterial GpuNormalsMaterial
Definition RenderData.h:538
GpuBuffers::SHProbeData SHProbeData
Definition RenderData.h:541
GpuBuffers::PrimitiveMeshletData PrimitiveMeshletData
Definition RenderData.h:524
GpuBuffers::InstanceData InstanceData
Definition RenderData.h:530
GpuBuffers::SunLightBuffer SunLightBuffer
Definition RenderData.h:544
GpuBuffers::MeshUnpackingData MeshUnpackingData
Definition RenderData.h:525
GpuBuffers::LocalBoundsData LocalBoundsData
Definition RenderData.h:523
GpuBuffers::VisibleMeshletInfo VisibleMeshletInfo
Definition RenderData.h:526
GpuBuffers::VisibleMeshletRange VisibleMeshletRange
Definition RenderData.h:527
GpuBuffers::InstanceCullingData InstanceCullingData
Definition RenderData.h:531
GpuBuffers::SunShadowCascadeBuffer SunShadowCascadeBuffer
Definition RenderData.h:545
GpuBuffers::ClusterGroupData ClusterGroupData
Definition RenderData.h:549
GpuBuffers::UnifiedMeshlet UnifiedMeshlet
Definition RenderData.h:519
GpuBuffers::PbrMaterial GpuPbrMaterial
Definition RenderData.h:537
GpuBuffers::DiffuseFlatColorMaterial GpuDiffuseFlatColorMaterial
Definition RenderData.h:535
GpuBuffers::SingleMeshletGeometryData SingleMeshletGeometryData
Definition RenderData.h:532
GpuBuffers::MeshPrimitiveRenderData MeshPrimitiveRenderData
Definition RenderData.h:521
CPU-side mesh data with per-object transform and primitives.
Definition RenderData.h:32
std::vector< CpuPrimitiveData > primitives
Definition RenderData.h:34
CPU-side primitive data.
Definition RenderData.h:19
uint32_t meshletOffset
First meshlet for this primitive.
Definition RenderData.h:23
Frustum planes for compute shader culling.
Definition RenderData.h:78
std::array< glm::vec4, 6 > planes[2]
[eyeIndex][planeIndex]
Definition RenderData.h:79
Per-group LOD data representing simplified child clusters.
Definition RenderData.h:459
float simplifiedError
Error threshold for this group.
Definition RenderData.h:461
glm::vec4 simplifiedBoundsPositionAndRadius
xyz = local center, w = radius
Definition RenderData.h:460
int32_t depth
DAG depth (0 = coarsest level)
Definition RenderData.h:462
Per-cluster LOD data for GPU-driven LOD selection.
Definition RenderData.h:442
uint64_t meshletDataAddress
Device address of the referenced UnifiedMeshlet.
Definition RenderData.h:448
uint32_t meshletIndex
Index into UnifiedMeshlet buffer.
Definition RenderData.h:446
int32_t groupId
Group this cluster belongs to (for parent error check)
Definition RenderData.h:447
float error
Simplification error (mesh-local units)
Definition RenderData.h:444
glm::vec4 boundsPositionAndRadius
xyz = local center, w = radius
Definition RenderData.h:443
int32_t refinedGroupId
Group this cluster simplifies (-1 for base geometry)
Definition RenderData.h:445
Cluster survivor data passed from culling to binning shaders.
Definition RenderData.h:490
uint32_t primitiveID
For transform/material lookup.
Definition RenderData.h:491
float ditherFactor
0.0-1.0 for transition blending
Definition RenderData.h:493
uint32_t clusterIndex
Global cluster index → maps to meshlet.
Definition RenderData.h:492
GPU-side diffuse textured material.
Definition RenderData.h:304
Compute dispatch dimensions.
Definition RenderData.h:92
Fixed-size dynamic point light buffer for shaders.
Definition RenderData.h:395
std::array< DynamicPointLight, MAX_DYNAMIC_POINT_LIGHTS > pointLights
Definition RenderData.h:398
GPU-side dynamic point light. positionRadius.xyz = world position, w = influence radius....
Definition RenderData.h:385
GPU-side mesh location and meshlet count.
Definition RenderData.h:102
Instance culling data for compute shader.
Definition RenderData.h:264
uint32_t meshGeometryId
Index into MeshGeometryData buffer.
Definition RenderData.h:267
uint32_t instanceId
Index into InstanceData buffer.
Definition RenderData.h:266
glm::vec4 worldPositionAndRadius
xyz = world position, w = radius
Definition RenderData.h:265
Per-instance data referencing shared geometry.
Definition RenderData.h:252
uint32_t meshGeometryId
Index into MeshGeometryData buffer.
Definition RenderData.h:254
Local-space bounding sphere data for GPU transformation.
Definition RenderData.h:166
glm::vec4 localCenterAndRadius
xyz = local center, w = local radius
Definition RenderData.h:167
LOD configuration UBO for GPU shader selection.
Definition RenderData.h:473
float cameraNear
Positive near plane distance.
Definition RenderData.h:476
float cameraProj11
projection[1][1] = cot(fov/2)
Definition RenderData.h:475
uint32_t ditherEnabled
1 = dither transitions, 0 = hard cut
Definition RenderData.h:477
float errorThresholdPixels
Target pixel error (default 1.0)
Definition RenderData.h:474
glm::vec4 cameraPosition
World-space camera position.
Definition RenderData.h:478
glm::vec2 screenSize
Render target dimensions.
Definition RenderData.h:479
Shared geometry metadata for instanced rendering with LOD support.
Definition RenderData.h:232
uint32_t clusterStartIndex
0xFFFFFFFF if no LOD
Definition RenderData.h:237
uint32_t singleMeshletGeoIndex
0xFFFFFFFF if multi-meshlet
Definition RenderData.h:236
Per-primitive render data for GPU shader access.
Definition RenderData.h:141
uint32_t shProbeIndex
Index into SH probe SSBO (0 = default)
Definition RenderData.h:144
Mesh unpacking metadata for compute shader.
Definition RenderData.h:187
uint32_t meshStartIndex
First meshlet for this mesh.
Definition RenderData.h:188
uint32_t objectIndex
Index into main SSBO.
Definition RenderData.h:190
GPU-side normals debug material.
Definition RenderData.h:352
Culling operation counters for GPU buffers.
Definition RenderData.h:221
Object culling data for compute shader.
Definition RenderData.h:154
glm::vec4 worldPositionAndRadius
xyz = world position, w = radius
Definition RenderData.h:155
GPU-side PBR material with spherical harmonics.
Definition RenderData.h:318
uint32_t roughnessMetallicTextureIndex
0xFFFFFFFF = not present
Definition RenderData.h:321
uint32_t lightmapTextureIndex
0xFFFFFFFF = not present
Definition RenderData.h:336
uint32_t baseColorTextureIndex
0xFFFFFFFF = not present
Definition RenderData.h:319
uint32_t emissiveTextureIndex
0xFFFFFFFF = not present
Definition RenderData.h:322
uint32_t normalMapBC5
1 = BC5 (RG), 0 = RGB
Definition RenderData.h:341
uint32_t normalTextureIndex
0xFFFFFFFF = not present
Definition RenderData.h:320
float alphaCutoff
Threshold for MASK mode.
Definition RenderData.h:339
Per-primitive meshlet range for culling shader.
Definition RenderData.h:174
Spherical harmonics probe data for dynamic lighting.
Definition RenderData.h:368
glm::vec4 coefficients[9]
L0-L2 RGB coefficients.
Definition RenderData.h:369
GPU data for single-meshlet vertex-shader path.
Definition RenderData.h:275
GPU-side single directional sun light. directionEnabled.xyz = direction the light travels in world sp...
Definition RenderData.h:409
glm::vec4 shadowParams
x = castsShadows, y = angular diameter degrees
Definition RenderData.h:412
glm::vec4 lightmapShadowParams
x = sun direct removal scale
Definition RenderData.h:413
GPU-side cascaded shadow data for the active directional sun.
Definition RenderData.h:423
glm::vec4 cascadeSplits
camera-forward far split per cascade
Definition RenderData.h:425
glm::vec4 cameraForward
xyz = cascade camera forward direction, w = render debug mode
Definition RenderData.h:428
glm::vec4 params
x = enabled, y = cascade count, z = map size, w = max distance
Definition RenderData.h:426
std::array< glm::mat4, MAX_SUN_SHADOW_CASCADES > lightViewProj
Definition RenderData.h:424
glm::vec4 biasParams
x = depth bias, y = normal bias, z = PCF radius, w = lightmapped receivers
Definition RenderData.h:427
GPU-side meshlet memory location and counts.
Definition RenderData.h:111
Visible LOD primitive data for parallel cluster selection.
Definition RenderData.h:504
uint32_t clusterStartIndex
First ClusterLodData index for this primitive.
Definition RenderData.h:506
uint32_t primitiveID
Primitive index for transform/material lookup.
Definition RenderData.h:505
uint32_t clusterCount
Number of clusters in this primitive's LOD hierarchy.
Definition RenderData.h:507
uint32_t meshGeometryId
Index into MeshGeometryData buffer.
Definition RenderData.h:508
Visible meshlet result from culling operation.
Definition RenderData.h:197
float ditherFactor
LOD transition dither factor (0.0-1.0)
Definition RenderData.h:201
Visible meshlet range per object for dispatch.
Definition RenderData.h:210
CPU-side mapping from MeshAsset to shared geometry buffer.
Definition RenderData.h:57
uint32_t vsIndexOffset
VS index buffer offset (single-meshlet only)
Definition RenderData.h:63
CPU-side per-object meshlet, vertex, and index data.
Definition RenderData.h:46
std::vector< GpuBuffers::UnifiedMeshlet > meshletData
Definition RenderData.h:47