33 lines
1.2 KiB
GLSL
33 lines
1.2 KiB
GLSL
#version 120
|
|
|
|
uniform struct p3d_MaterialParameters {
|
|
vec4 baseColor;
|
|
vec4 emission;
|
|
float roughness;
|
|
float metallic;
|
|
} p3d_Material;
|
|
|
|
uniform sampler2D p3d_TextureBaseColor;
|
|
uniform sampler2D p3d_TextureMetalRoughness;
|
|
uniform sampler2D p3d_TextureNormal;
|
|
uniform sampler2D p3d_TextureEmission;
|
|
|
|
varying vec3 v_view_position;
|
|
varying vec3 v_world_position;
|
|
varying vec4 v_color;
|
|
varying vec2 v_texcoord;
|
|
varying mat3 v_view_tbn;
|
|
varying mat3 v_world_tbn;
|
|
|
|
void main() {
|
|
vec4 metal_rough = texture2D(p3d_TextureMetalRoughness, v_texcoord);
|
|
float metallic = clamp(p3d_Material.metallic * metal_rough.b, 0.0, 1.0);
|
|
float roughness = clamp(p3d_Material.roughness * metal_rough.g, 0.0, 1.0);
|
|
vec4 base_color = p3d_Material.baseColor * v_color * texture2D(p3d_TextureBaseColor, v_texcoord);
|
|
vec3 normal = normalize(v_view_tbn * (2.0 * texture2D(p3d_TextureNormal, v_texcoord).rgb - 1.0));
|
|
vec3 emission = p3d_Material.emission.rgb * texture2D(p3d_TextureEmission, v_texcoord).rgb;
|
|
vec3 lit = base_color.rgb * (0.15 + max(0.0, normal.z) * (1.0 - roughness * 0.5));
|
|
lit = mix(lit, base_color.rgb, metallic * 0.25);
|
|
gl_FragColor = vec4(lit + emission, base_color.a);
|
|
}
|