precision mediump float; #define f32 float #define f64 double #define u32 uint #define i32 int #define b32 bool #ifdef VERTEX_SHADER # define varying_param out layout(location = 0) in vec4 a_color; layout(location = 1) in vec4 a_tangent; layout(location = 2) in vec3 a_pos; layout(location = 3) in vec3 a_normal; layout(location = 4) in vec2 a_uv0; layout(location = 5) in vec2 a_uv1; #else # define varying_param in layout(location = 0) out vec4 FragColor; #define AlbedoTexture u_texture0 #define NormalTexture u_texture1 #define MetallicTexture u_texture2 #define RoughnessTexture u_texture3 #define OcclusionTexture u_texture4 #define EmissionTexture u_texture5 #define HeightTexture u_texture6 #define CubemapTexture u_texture7 #define IrradianceTexture u_texture8 #define PrefilterTexture u_texture9 #define BRDFTexture u_texture10 uniform sampler2D u_texture0; uniform sampler2D u_texture1; uniform sampler2D u_texture2; uniform sampler2D u_texture3; uniform sampler2D u_texture4; uniform sampler2D u_texture5; uniform sampler2D u_texture6; uniform sampler2D u_texture7; uniform sampler2D u_texture8; uniform sampler2D u_texture9; uniform sampler2D u_texture10; #endif #define MMI_Albedo 0 #define MMI_Normal 1 #define MMI_Metallic 2 #define MMI_Roughness 3 #define MMI_Occlusion 4 #define MMI_Emission 5 #define MMI_Height 6 #define MMI_Cubemap 7 #define MMI_Irradiance 8 #define MMI_Prefilter 9 #define MMI_BRDF 10 #define MMI_MAX 11 #define AlbedoMaterial material_maps[MMI_Albedo] #define NormalMaterial material_maps[MMI_Normal] #define MetallicMaterial material_maps[MMI_Metallic] #define RoughnessMaterial material_maps[MMI_Roughness] #define OcclusionMaterial material_maps[MMI_Occlusion] #define EmissionMaterial material_maps[MMI_Emission] #define HeightMaterial material_maps[MMI_Height] #define CubemapMaterial material_maps[MMI_Cubemap] #define IrradianceMaterial material_maps[MMI_Irradiance] #define PrefilterMaterial material_maps[MMI_Prefilter] #define BRDFMaterial material_maps[MMI_BRDF] #define VertexMain main #define FragmentMain main struct MaterialMap { vec4 color; f32 value; }; layout(location = 0) varying_param vec2 v_uv0; layout(location = 1) varying_param vec2 v_uv1; layout(std140, binding = 0) uniform Globals { mat4 projection; mat4 view; }; layout(std140, binding = 1) uniform ModelState { bool albedo_texture; bool normal_texture; bool metallic_roughness_texture; bool occlusion_texture; bool emission_texture; bool height_texture; bool cubemap_texture; bool irradiance_texture; bool prefilter_texture; bool brdf_texture; }; layout(std140, binding = 2) uniform InstanceState { mat4 model_matrix; }; layout(std140, binding = 3) uniform Materials { MaterialMap material_maps[MMI_MAX]; }; #ifdef VERTEX_SHADER void VertexMain() { gl_Position = projection * model_matrix * vec4(a_pos, 1.0); v_uv0 = a_uv0; } #else void FragmentMain() { if(albedo_texture) { FragColor = texture(AlbedoTexture, v_uv0); } else { FragColor = AlbedoMaterial.color; } } #endif