9 uniform sampler2D normal_map;
10 uniform samplerCube environment_map;
12 layout(constant_id=auto) const bool use_normal_map = false;
14 #pragma MSP stage(vertex)
15 virtual vec4 get_vertex_position()
20 virtual vec3 get_vertex_normal()
25 virtual mat4 get_vertex_transform()
27 return eye_obj_matrix;
30 virtual mat3 get_normal_transform()
32 return eye_obj_normal_matrix;
35 void standard_transform()
37 mat4 vertex_tf = get_vertex_transform();
38 mat3 normal_tf = get_normal_transform();
40 out vec4 eye_vertex = vertex_tf*get_vertex_position();
41 gl_Position = projection_matrix*eye_vertex;
43 out vec3 eye_normal = normal_tf*get_vertex_normal();
44 vec3 eye_tangent = normal_tf*tangent;
45 vec3 eye_binormal = normal_tf*binormal;
46 out mat3 eye_tbn_matrix = mat3(eye_tangent, eye_binormal, eye_normal);
48 out vec3 eye_look_dir = normalize(eye_vertex.xyz);
49 out vec3 tbn_look_dir = eye_look_dir*eye_tbn_matrix;
51 out vec3 eye_light_dir = normalize(light_sources[0].position.xyz-eye_vertex.xyz*light_sources[0].position.w);
52 out vec3 tbn_light_dir = eye_light_dir*eye_tbn_matrix;
54 out vec3 eye_halfway_dir = normalize(eye_light_dir-eye_look_dir);
55 out vec3 tbn_halfway_dir = eye_halfway_dir*eye_tbn_matrix;
57 out vec3 tbn_zenith_dir = eye_zenith_dir*eye_tbn_matrix;
58 out float fog_coord = eye_vertex.z;
62 for(int i=0; i<max_clip_planes; ++i)
63 gl_ClipDistance[i] = dot(eye_vertex, clip_planes[i].equation);
66 shadow_transform(eye_vertex);
69 virtual void custom_transform()
80 #pragma MSP stage(fragment)
81 virtual vec3 get_fragment_normal()
84 return normalize(texture(normal_map, texcoord.xy).xyz*2.0-1.0);
86 return vec3(0.0, 0.0, 1.0);
89 virtual vec4 get_environment_sample(vec3 direction)
91 return texture(environment_map, direction);
94 virtual vec3 get_reflection(vec3 normal, vec3 look)
96 vec3 reflect_dir = reflect(look, normal);
98 reflect_dir = eye_tbn_matrix*reflect_dir;
100 return get_environment_sample(env_eye_matrix*reflect_dir).rgb;
103 vec3 apply_fog(vec3 color)
105 float fog_value = exp(fog_coord*fog_density);
106 return mix(fog_color.rgb, color, fog_value);