struct VertexData { vec4 Normal; vec2 TexCoord0; vec2 TexCoord1; vec4 Color; }; struct Material { vec4 m_AlbedoFactor; // 16 16 vec3 m_EmissionFactor; // 12 28 float m_MetalFactor; // 04 32 float m_RoughFactor; // 04 36 uint m_AlbedoTex; // 04 40 uint m_NormalTex; // 04 44 uint m_MetalRoughTex; // 04 48 uint m_OcclusionTex; // 04 52 uint m_EmissionTex; // 04 56 // We might be able to go upto 64 without pains. }; struct PointLight { vec3 m_Position; float m_Range; uint m_Color; float m_Intensity; }; struct DirectionalLight { vec3 m_Direction; float m_Validity_; uint m_Color; float m_Intensity; }; // ---------- Bindless Bindings ---------- #define INVALID_HANDLE 0xFFFFFFFF layout (std430, set = 0, binding = 0) readonly buffer PointLightBuffer { PointLight lights[]; } pointLightBuffers[]; layout (std430, set = 0, binding = 0) readonly buffer DirectionLightBuffer { DirectionalLight lights[]; } directionalLightBuffers[]; layout (set = 0, binding = 1) uniform sampler2D textures[]; layout (set = 0, binding = 1) uniform samplerCube textureCubes[]; // ---------- Buffer References ---------- layout(std430, buffer_reference, buffer_reference_align=16) readonly buffer VPositionRef { vec4 Positions[]; }; layout(std430, buffer_reference, buffer_reference_align=16) readonly buffer VDataRef { VertexData Data[]; }; layout(std430, buffer_reference, buffer_reference_align=8) readonly buffer MaterialsRef { Material materials[]; }; layout(std430, buffer_reference, buffer_reference_align=8) readonly buffer MaterialRef { Material material; }; // Node struct Node { mat4 globalTransform; // 64 64 VPositionRef pVertexPosition; // 08 72 VDataRef pVertexData; // 08 80 MaterialRef pMaterial; // 08 88 // pad // 08 96 }; layout(std430, buffer_reference, buffer_reference_align=8) readonly buffer NodeRef { Node nodes[]; };