#version 450 #pragma shader_stage(fragment) #extension GL_EXT_nonuniform_qualifier : enable layout (location = 0) in vec2 inUV; layout (location = 0) out vec4 outColor; struct VertexData { float position[4]; }; struct MaterialData { float m_AlbedoFactor[4]; float m_EmissionFactor[3]; float m_MetalFactor; float m_RoughFactor; uint m_AlbedoTex; uint m_NormalTex; uint m_MetalRoughTex; uint m_OcclusionTex; uint m_EmissionTex; }; #define INVALID_HANDLE 0xFFFFFFFF layout(set = 0, binding = 1) uniform sampler2D textures[]; layout(std430, set = 0, binding = 0) readonly buffer Vertices { VertexData data[]; } vertexBuffer[]; layout(std430, set = 0, binding = 0) readonly buffer Materials { MaterialData data[]; } materialsBuffer[]; layout(push_constant) uniform Block { uint vertexBufferHandle; uint uvBufferHandle; uint materialBufferHandle; uint m_VertexOffset; int m_NormalOffset; // <0 for invalid int m_TexCoord0Offset; // <0 for invalid uint m_FirstIndex; uint m_IndexCount; int m_MaterialIdx; // <0 for invalid } pcb; vec4 ToVec4(float array[4]) { return vec4(array[0], array[1], array[2], array[3]); } vec4 GetAlbedo(uint materialBufferId, int materialId, vec2 uv0) { if (materialId < 0) { return vec4(1.0f, 0.0f, 1.0f, 1.0f); } else { vec4 albedoFactor = ToVec4(materialsBuffer[materialBufferId].data[materialId].m_AlbedoFactor); uint albedoTexId = materialsBuffer[materialBufferId].data[materialId].m_AlbedoTex; if (albedoTexId == INVALID_HANDLE) { return albedoFactor; } else { return texture(textures[albedoTexId], uv0); } } } void main() { outColor = GetAlbedo(pcb.materialBufferHandle, pcb.m_MaterialIdx, inUV);// texture(textures[materialsBuffer[pcb.materialBufferHandle].data[pcb.m_MaterialIdx].m_AlbedoTex], inUV);// ToVec4(materialsBuffer[pcb.materialBufferHandle].data[pcb.m_MaterialIdx].m_AlbedoFactor);// vec4(texture(textures[textureHandle], inUV).rgb, 1.0f); }