-struct LightSourceParameters
-{
- vec4 position;
- vec4 diffuse;
- vec4 specular;
-};
-
-struct MaterialParameters
-{
- vec4 ambient;
- vec4 diffuse;
- vec4 specular;
- float shininess;
-};
-
-struct ClipPlane
-{
- vec4 equation;
-};
-
-uniform mat4 eye_obj_matrix;
-uniform mat3 eye_obj_normal_matrix;
-uniform Transform
-{
- mat4 projection_matrix;
-};
-
-uniform Material
-{
- MaterialParameters material;
- float reflectivity;
-};
+import msp_interface;
const bool use_vertex_color = false;
const bool use_specular = false;
const bool use_sky = false;
const bool use_fog = false;
-uniform Lighting
-{
- // Declared as an array for compatibility reasons
- LightSourceParameters light_sources[1];
- vec4 ambient_color;
- vec4 sky_color;
- vec3 eye_sky_dir;
- float horizon_limit;
- vec4 fog_color;
- float fog_density;
-};
const bool use_diffuse_map = false;
-uniform sampler2D diffuse_map;
-
const bool use_normal_map = false;
-uniform sampler2D normal_map;
const bool use_shadow_map = false;
-uniform sampler2DShadow shadow;
-uniform ShadowMap
-{
- float shadow_darkness;
- mat4 shd_eye_matrix;
-};
-const bool use_reflection = false;
const bool use_environment_map = false;
-uniform samplerCube environment;
-uniform EnvMap
-{
- mat3 env_eye_matrix;
-};
-
-const int max_clip_planes = 0;
-uniform Clipping
-{
- ClipPlane clip_planes[max_clip_planes];
-};
-
-////// vertex
-in vec4 vertex;
-in vec4 texcoord;
-in vec4 color;
-in vec3 normal;
-in vec3 tangent;
-in vec3 binormal;
+#pragma MSP stage(vertex)
vec4 get_vertex_position()
{
return vertex;
ldir = ldir*eye_tbn_matrix;
out vec3 light_dir = ldir;
- out vec3 tbn_sky_dir = eye_sky_dir*eye_tbn_matrix;
+ out vec3 tbn_zenith_dir = eye_zenith_dir*eye_tbn_matrix;
out vec3 shadow_coord = (shd_eye_matrix*eye_vertex).xyz;
out float fog_coord = eye_vertex.z;
passthrough;
}
-////// fragment
-out vec4 frag_color;
-
+#pragma MSP stage(fragment)
vec4 get_diffuse_sample()
{
return texture(diffuse_map, texcoord.xy);
return texture(normal_map, texcoord.xy).xyz*2.0-1.0;
}
+vec4 get_environment_sample(vec3 direction)
+{
+ return texture(environment, direction);
+}
+
vec3 normal;
vec4 diffuse_sample;
vec3 ambient_light = ambient_color.rgb;
if(use_sky)
{
- vec3 sky_dir;
+ vec3 zenith_dir;
if(use_normal_map)
- sky_dir = tbn_sky_dir;
+ zenith_dir = tbn_zenith_dir;
else
- sky_dir = eye_sky_dir;
- float skylight_intensity = dot(normal, sky_dir)*0.5+0.5;
+ zenith_dir = eye_zenith_dir;
+ float skylight_intensity = dot(normal, zenith_dir)*0.5+0.5;
ambient_light += skylight_intensity*sky_color.rgb;
}
vec3 reflect_dir = reflect(incident_dir, normal);
if(use_normal_map)
reflect_dir = eye_tbn_matrix*reflect_dir;
- vec3 result = vec3(0.0);
- if(use_environment_map)
- result += texture(environment, env_eye_matrix*reflect_dir).rgb*reflectivity;
-
- if(use_sky && use_specular)
- {
- float reflect_altitude = clamp(dot(reflect_dir, eye_sky_dir)-horizon_limit, -1.0, 0.0);
- float sky_specular_intensity = pow((1.0-reflect_altitude*reflect_altitude), material.shininess/2.0);
- result += sky_specular_intensity*sky_color.rgb;
- }
-
- return result;
+ return get_environment_sample(env_eye_matrix*reflect_dir).rgb;
}
vec4 singlepass_color()
else
final_color = singlepass_color();
- if(use_reflection)
+ if(use_environment_map)
final_color += vec4(singlepass_reflection(), 0.0);
if(use_fog)
{