struct VertexData { float4 Normal; float2 TexCoord0; float2 TexCoord1; float4 Color0; }; struct TransformData { float4x4 Transform; float4x4 NormalTransform; }; struct MaterialData { float AlbedoFactor[4]; float EmissionFactor[3]; float MetalFactor; float RoughFactor; uint AlbedoTex; uint NormalTex; uint MetalRoughTex; uint OcclusionTex; uint EmissionTex; }; struct Block { uint VertexBufferHandle; uint VertexDataHandle; uint MaterialBufferHandle; uint NodeBufferHandle; uint LightHandle; uint PointLightIndexer; uint DirectionalLightIndexer; int MaterialIdx; uint NodeIdx; }; struct PointLight { float Position[3]; float Range; uint Color; float Intensity; }; struct DirectionalLight { float Direction[3]; float Validity_; uint Color; float Intensity; }; struct CameraData { float4x4 View; float4x4 Projection; float4 Position; }; // Little Endian storage. First short is least significant. #define IndexerCount(Indexer) (Indexer & 0xFFFF) #define IndexerOffset(Indexer) ((Indexer & 0xFFFF0000) >> 16); #define INVALID_HANDLE 0xFFFFFFFF static const float PI = 3.14159265f; [[vk::binding(0, 0)]] StructuredBuffer VertexBuffer[]; [[vk::binding(0, 0)]] StructuredBuffer VertexDataBuffer[]; [[vk::binding(0, 0)]] StructuredBuffer MaterialsBuffer[]; [[vk::binding(0, 0)]] StructuredBuffer NodeBuffer[]; [[vk::binding(0, 0)]] StructuredBuffer PointLightBuffer[]; [[vk::binding(0, 0)]] StructuredBuffer DirectionalLightBuffer[]; [[vk::binding(1, 0)]] Texture2D Textures[]; [[vk::binding(1, 0)]] SamplerState ImmutableSamplers[]; [[vk::binding(0, 1)]] ConstantBuffer Camera; [[vk::push_constant]] Block PushConstant;