#version 450 // Keep in sync manually with Java code const int MAX_TEXTURES = 512; layout (location = 0) in vec2 inTextCoords; layout (location = 1) in flat uint inMaterialIdx; layout(location = 0) out vec2 outFragColor; struct Material { vec4 diffuseColor; //16 uint hasTexture; //20 uint textureIdx; //24 uint hasNormalMap; //28 uint normalMapIdx; //32 uint hasRoughMap; //36 uint roughMapIdx; //40 float roughnessFactor; //44 float metallicFactor; //48 vec4 emissiveColour; //64 uint hasEmissiveMap; //68 uint emissiveMapIdx; //72 uint hasTranslucencyMap; //76 uint translucencyMapIdx; //80 float translucencyFactor; //84 uint hasOpacityMap; //88 uint OpacityMapIdx; //92 float OpacityFactor; //96 float reflectiveness; //100 float refractiveness; //104 float Padding1; //108 float Padding2; //112 }; layout(set = 1, binding = 0) uniform sampler2D textSampler[MAX_TEXTURES]; layout(set = 2, binding = 0) readonly buffer MaterialUniform { Material materials[]; } matUniform; void main() { Material material = matUniform.materials[inMaterialIdx]; float Refractiveness = material.refractiveness; float Reflectiveness = material.reflectiveness; float Translucency = material.translucencyFactor; float Opacity = material.OpacityFactor; if(material.hasTranslucencyMap > 0){ vec4 translucencyMap = texture(textSampler[material.translucencyMapIdx], inTextCoords); Translucency = (translucencyMap.x + translucencyMap.y + translucencyMap.z)/3.0; } if(material.hasOpacityMap > 0){ vec4 opacityMap = texture(textSampler[material.OpacityMapIdx], inTextCoords); Opacity = (opacityMap.x + opacityMap.y + opacityMap.z)/3.0; } int textureIndex = int(material.textureIdx); if (textureIndex >= MAX_TEXTURES){ outFragColor = vec2(0.0,0.0); return; } vec4 albedo; if (material.hasTexture == 1) { albedo = texture(textSampler[material.textureIdx], inTextCoords); } else { albedo = material.diffuseColor; } if (albedo.a < 0.5 || Translucency > 0.5 || Opacity < 0.5) { discard; } float depth = gl_FragCoord.z; float moment1 = depth; float moment2 = depth * depth; float dx = dFdx(depth); float dy = dFdy(depth); moment2 += 0.25 * (dx * dx + dy * dy); outFragColor = vec2(moment1, moment2); }