project-aster/samples/04_scenes/shader/bindless_structs.glsl

89 lines
2.2 KiB
GLSL

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
/*
AlphaBlend < 0 means Opaque
AlphaBlend > 1 means Blend
AlphaBlend in [0,1] means cutoff
*/
float AlphaBlend; // 04 60
// 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[];
};