#extension GL_ARB_bindless_texture : enable struct DrawCmdData { mat4 transform; int materialIdx; }; // UBOs layout(std140, binding = 0) uniform Matrices { mat4 projection; mat4 view; }; layout(std430, binding = 3) readonly buffer DrawCmdDatas { // Access by gl_DrawID DrawCmdData draw_data[]; }; VERTEX_EXPORT flat uint DrawID; VERTEX_EXPORT VertexData { vec2 uv; } VertexOut; #if VERTEX_SHADER layout(location = 0) in vec3 aPos; layout(location = 2) in vec2 aUV; void main() { DrawID = gl_BaseInstance + gl_InstanceID; mat4 model = draw_data[DrawID].transform; mat4 viewModel = view * model; vec4 vPos = viewModel * vec4(aPos.xyz, 1.0); gl_Position = projection * vPos; VertexOut.uv = aUV; } #endif #if FRAGMENT_SHADER struct Material { vec4 albedo; sampler2D albedo_map; vec2 albedo_map_uv_scale; sampler2D normal_map; vec2 normal_map_uv_scale; float metallic; sampler2D metallic_map; vec2 metallic_map_uv_scale; float roughness; sampler2D roughness_map; vec2 roughness_map_uv_scale; vec3 emission; sampler2D emission_map; vec2 emission_map_uv_scale; }; layout(std430, binding = 2) readonly buffer Materials { uint materials_count; Material materials[]; }; vec4 getAlbedo(int materialIdx) { return textureSize(materials[materialIdx].albedo_map, 0) == ivec2(0) ? vec4(pow(materials[materialIdx].albedo.rgb, vec3(2.2)), materials[materialIdx].albedo.a) : texture(materials[materialIdx].albedo_map, VertexOut.uv * materials[materialIdx].albedo_map_uv_scale); } out vec4 FragColor; void main() { int matIdx = draw_data[DrawID].materialIdx; if (getAlbedo(matIdx).a < 0.5) { discard; } } #endif