|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// Structs |
|
/////////////////////////////////////////////////////////////////////////////// |
|
|
|
struct Material { |
|
vec3 emissive_factor; |
|
|
|
|
|
vec4 base_color_factor; |
|
float metallic_factor; |
|
float roughness_factor; |
|
|
|
|
|
|
|
vec4 diffuse_factor; |
|
vec3 specular_factor; |
|
float glossiness_factor; |
|
|
|
|
|
|
|
sampler2D normal_texture; |
|
|
|
|
|
sampler2D occlusion_texture; |
|
|
|
|
|
sampler2D emissive_texture; |
|
|
|
|
|
sampler2D base_color_texture; |
|
|
|
|
|
sampler2D metallic_roughness_texture; |
|
|
|
|
|
sampler2D diffuse_texture; |
|
|
|
|
|
sampler2D specular_glossiness; |
|
|
|
}; |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// Uniforms |
|
/////////////////////////////////////////////////////////////////////////////// |
|
uniform Material material; |
|
uniform vec3 cam_pos; |
|
|
|
|
|
uniform samplerCube diffuse_env; |
|
uniform samplerCube specular_env; |
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// Inputs |
|
/////////////////////////////////////////////////////////////////////////////// |
|
|
|
in vec3 frag_position; |
|
|
|
in vec3 frag_normal; |
|
|
|
|
|
|
|
|
|
in mat3 tbn; |
|
|
|
|
|
|
|
|
|
in vec2 uv_0; |
|
|
|
|
|
in vec2 uv_1; |
|
|
|
|
|
in vec4 color_multiplier; |
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// OUTPUTS |
|
/////////////////////////////////////////////////////////////////////////////// |
|
|
|
out vec4 frag_color; |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// Constants |
|
/////////////////////////////////////////////////////////////////////////////// |
|
const float PI = 3.141592653589793; |
|
const float min_roughness = 0.04; |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// Utility Functions |
|
/////////////////////////////////////////////////////////////////////////////// |
|
vec4 srgb_to_linear(vec4 srgb) |
|
{ |
|
|
|
// Fast Approximation |
|
//vec3 linOut = pow(srgbIn.xyz,vec3(2.2)); |
|
// |
|
vec3 b_less = step(vec3(0.04045),srgb.xyz); |
|
vec3 lin_out = mix( srgb.xyz/vec3(12.92), pow((srgb.xyz+vec3(0.055))/vec3(1.055),vec3(2.4)), b_less ); |
|
return vec4(lin_out, srgb.w); |
|
|
|
return srgb; |
|
|
|
} |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// MAIN |
|
/////////////////////////////////////////////////////////////////////////////// |
|
void main() |
|
{ |
|
|
|
// Compute albedo |
|
vec4 base_color = material.base_color_factor; |
|
|
|
base_color = base_color * texture(material.base_color_texture, uv_0); |
|
|
|
|
|
|
|
base_color *= color_multiplier; |
|
|
|
|
|
frag_color = clamp(base_color, 0.0, 1.0); |
|
} |
|
|