#version 450 #extension GL_EXT_nonuniform_qualifier : require const int MAX_TEXTURES = 128; layout(location = 0) in vec4 inPos; layout(location = 1) in vec3 inNormal; layout(location = 2) in vec3 inTangent; layout(location = 3) in vec3 inBitangent; layout(location = 4) in vec2 inTextCoords; layout(location = 5) in mat4 viewMatrix; layout(location = 9) in flat uint textureIndex; layout(location = 0) out vec4 outAlbedo; layout(location = 1) out vec4 outViewPos; 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 = 2, binding = 0) readonly buffer MaterialUniform{ Material materials[]; } matUniform; layout(set = 3, binding = 0) uniform sampler2D textSampler[MAX_TEXTURES]; layout(push_constant) uniform pc{ layout(offset = 64) uint materialIdx; } push_constants; void main() { vec4 viewPos = vec4(viewMatrix * inPos); outViewPos = viewPos; Material material = matUniform.materials[textureIndex]; uint albedoTextureIndex = material.textureIdx; if (albedoTextureIndex >= MAX_TEXTURES){ outAlbedo = vec4(0.0,0.0,1.0,1.0); return; } if(material.hasTexture == 1){ vec4 texColor = texture(textSampler[nonuniformEXT(albedoTextureIndex)], inTextCoords); outAlbedo = texColor; } else{ outAlbedo = material.diffuseColor; } vec4 Opacity = vec4(outAlbedo.a, outAlbedo.a, outAlbedo.a, 1.0); if (material.OpacityFactor > 0.0 && material.OpacityFactor < 1.0) { Opacity = vec4(material.OpacityFactor, material.OpacityFactor, material.OpacityFactor, 1.0); } if (material.hasOpacityMap > 0 && material.OpacityMapIdx < MAX_TEXTURES) { Opacity = texture(textSampler[nonuniformEXT(material.OpacityMapIdx)], inTextCoords); } float opacityf = Opacity.x + Opacity.y + Opacity.z; opacityf = opacityf / 3; if(opacityf < 0.4){ discard; } outAlbedo = vec4(outAlbedo.rgb, opacityf); }