punyverse/punyverse/shaders/planet.fragment.glsl

56 lines
1.6 KiB
Plaintext
Raw Normal View History

2018-08-26 03:38:26 -04:00
#version 130
in vec2 v_uv;
in vec3 v_normal;
in vec3 v_position;
in vec3 v_camDirection;
in mat3 v_TBN;
2018-08-26 18:11:18 -04:00
out vec4 o_fragColor;
2018-08-26 03:38:26 -04:00
struct Surface {
sampler2D diffuseMap;
bool hasNormal;
sampler2D normalMap;
bool hasSpecular;
sampler2D specularMap;
bool hasEmission;
sampler2D emissionMap;
vec3 ambient;
vec3 diffuse;
vec3 specular;
vec3 emission;
float shininess;
};
struct Sun {
vec3 ambient;
vec3 diffuse;
vec3 specular;
vec3 position;
float intensity;
};
uniform Sun u_sun;
uniform Surface u_planet;
void main() {
vec3 normal = u_planet.hasNormal ? normalize(v_TBN * texture2D(u_planet.normalMap, v_uv).rgb * 2 - 1) : v_normal;
2018-08-26 03:59:14 -04:00
vec3 diffuse = texture2D(u_planet.diffuseMap, v_uv).rgb;
2018-08-26 03:38:26 -04:00
vec3 specular = u_planet.hasSpecular ? texture2D(u_planet.specularMap, v_uv).rgb : vec3(1);
vec3 emission = u_planet.hasEmission ? texture2D(u_planet.emissionMap, v_uv).rgb : vec3(1);
vec3 incident = normalize(u_sun.position - v_position);
2018-08-26 04:42:46 -04:00
vec3 reflected = normalize(reflect(-incident, normal));
2018-08-26 03:38:26 -04:00
float diffuseIntensity = max(dot(normal, incident), 0.0);
2018-08-26 04:42:46 -04:00
float shininess = pow(max(dot(normalize(v_camDirection), reflected), 0), u_planet.shininess);
2018-08-26 03:38:26 -04:00
vec3 ambient = u_planet.ambient * u_sun.ambient * diffuse;
diffuse *= u_planet.diffuse * u_sun.diffuse * diffuseIntensity;
emission *= u_planet.emission * (1 - min(diffuseIntensity * 2, 1));
2018-08-26 04:42:46 -04:00
specular *= u_planet.specular * u_sun.specular * max(shininess, 0) * diffuseIntensity;
2018-08-26 03:38:26 -04:00
2018-08-26 18:11:18 -04:00
o_fragColor = vec4((ambient + diffuse + emission + specular) * u_sun.intensity, 1);
2018-08-26 03:38:26 -04:00
}