Renderer/shaders/pbr.glsl

142 lines
3.0 KiB
GLSL

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