|
@@ -165,112 +165,117 @@ IGL_INLINE void igl::opengl::MeshGL::init()
|
|
|
}
|
|
|
is_initialized = true;
|
|
|
std::string mesh_vertex_shader_string =
|
|
|
- "#version 150\n"
|
|
|
- "uniform mat4 model;"
|
|
|
- "uniform mat4 view;"
|
|
|
- "uniform mat4 proj;"
|
|
|
- "in vec3 position;"
|
|
|
- "in vec3 normal;"
|
|
|
- "out vec3 position_eye;"
|
|
|
- "out vec3 normal_eye;"
|
|
|
- "in vec4 Ka;"
|
|
|
- "in vec4 Kd;"
|
|
|
- "in vec4 Ks;"
|
|
|
- "in vec2 texcoord;"
|
|
|
- "out vec2 texcoordi;"
|
|
|
- "out vec4 Kai;"
|
|
|
- "out vec4 Kdi;"
|
|
|
- "out vec4 Ksi;"
|
|
|
-
|
|
|
- "void main()"
|
|
|
- "{"
|
|
|
- " position_eye = vec3 (view * model * vec4 (position, 1.0));"
|
|
|
- " normal_eye = vec3 (view * model * vec4 (normal, 0.0));"
|
|
|
- " normal_eye = normalize(normal_eye);"
|
|
|
- " gl_Position = proj * vec4 (position_eye, 1.0);" //proj * view * model * vec4(position, 1.0);"
|
|
|
- " Kai = Ka;"
|
|
|
- " Kdi = Kd;"
|
|
|
- " Ksi = Ks;"
|
|
|
- " texcoordi = texcoord;"
|
|
|
- "}";
|
|
|
-
|
|
|
- std::string mesh_fragment_shader_string =
|
|
|
- "#version 150\n"
|
|
|
- "uniform mat4 model;"
|
|
|
- "uniform mat4 view;"
|
|
|
- "uniform mat4 proj;"
|
|
|
- "uniform vec4 fixed_color;"
|
|
|
- "in vec3 position_eye;"
|
|
|
- "in vec3 normal_eye;"
|
|
|
- "uniform vec3 light_position_world;"
|
|
|
- "vec3 Ls = vec3 (1, 1, 1);"
|
|
|
- "vec3 Ld = vec3 (1, 1, 1);"
|
|
|
- "vec3 La = vec3 (1, 1, 1);"
|
|
|
- "in vec4 Ksi;"
|
|
|
- "in vec4 Kdi;"
|
|
|
- "in vec4 Kai;"
|
|
|
- "in vec2 texcoordi;"
|
|
|
- "uniform sampler2D tex;"
|
|
|
- "uniform float specular_exponent;"
|
|
|
- "uniform float lighting_factor;"
|
|
|
- "uniform float texture_factor;"
|
|
|
- "out vec4 outColor;"
|
|
|
- "void main()"
|
|
|
- "{"
|
|
|
- "vec3 Ia = La * vec3(Kai);" // ambient intensity
|
|
|
-
|
|
|
- "vec3 light_position_eye = vec3 (view * vec4 (light_position_world, 1.0));"
|
|
|
- "vec3 vector_to_light_eye = light_position_eye - position_eye;"
|
|
|
- "vec3 direction_to_light_eye = normalize (vector_to_light_eye);"
|
|
|
- "float dot_prod = dot (direction_to_light_eye, normal_eye);"
|
|
|
- "float clamped_dot_prod = max (dot_prod, 0.0);"
|
|
|
- "vec3 Id = Ld * vec3(Kdi) * clamped_dot_prod;" // Diffuse intensity
|
|
|
-
|
|
|
- "vec3 reflection_eye = reflect (-direction_to_light_eye, normal_eye);"
|
|
|
- "vec3 surface_to_viewer_eye = normalize (-position_eye);"
|
|
|
- "float dot_prod_specular = dot (reflection_eye, surface_to_viewer_eye);"
|
|
|
- "dot_prod_specular = float(abs(dot_prod)==dot_prod) * max (dot_prod_specular, 0.0);"
|
|
|
- "float specular_factor = pow (dot_prod_specular, specular_exponent);"
|
|
|
- "vec3 Is = Ls * vec3(Ksi) * specular_factor;" // specular intensity
|
|
|
- "vec4 color = vec4(lighting_factor * (Is + Id) + Ia + (1.0-lighting_factor) * vec3(Kdi),(Kai.a+Ksi.a+Kdi.a)/3);"
|
|
|
- "outColor = mix(vec4(1,1,1,1), texture(tex, texcoordi), texture_factor) * color;"
|
|
|
- "if (fixed_color != vec4(0.0)) outColor = fixed_color;"
|
|
|
- "}";
|
|
|
+R"(#version 150
|
|
|
+ uniform mat4 model;
|
|
|
+ uniform mat4 view;
|
|
|
+ uniform mat4 proj;
|
|
|
+ in vec3 position;
|
|
|
+ in vec3 normal;
|
|
|
+ out vec3 position_eye;
|
|
|
+ out vec3 normal_eye;
|
|
|
+ in vec4 Ka;
|
|
|
+ in vec4 Kd;
|
|
|
+ in vec4 Ks;
|
|
|
+ in vec2 texcoord;
|
|
|
+ out vec2 texcoordi;
|
|
|
+ out vec4 Kai;
|
|
|
+ out vec4 Kdi;
|
|
|
+ out vec4 Ksi;
|
|
|
+
|
|
|
+ void main()
|
|
|
+ {
|
|
|
+ position_eye = vec3 (view * model * vec4 (position, 1.0));
|
|
|
+ normal_eye = vec3 (view * model * vec4 (normal, 0.0));
|
|
|
+ normal_eye = normalize(normal_eye);
|
|
|
+ gl_Position = proj * vec4 (position_eye, 1.0); //proj * view * model * vec4(position, 1.0);
|
|
|
+ Kai = Ka;
|
|
|
+ Kdi = Kd;
|
|
|
+ Ksi = Ks;
|
|
|
+ texcoordi = texcoord;
|
|
|
+ }
|
|
|
+)";
|
|
|
+
|
|
|
+ std::string mesh_fragment_shader_string =
|
|
|
+R"(#version 150
|
|
|
+ uniform mat4 model;
|
|
|
+ uniform mat4 view;
|
|
|
+ uniform mat4 proj;
|
|
|
+ uniform vec4 fixed_color;
|
|
|
+ in vec3 position_eye;
|
|
|
+ in vec3 normal_eye;
|
|
|
+ uniform vec3 light_position_world;
|
|
|
+ vec3 Ls = vec3 (1, 1, 1);
|
|
|
+ vec3 Ld = vec3 (1, 1, 1);
|
|
|
+ vec3 La = vec3 (1, 1, 1);
|
|
|
+ in vec4 Ksi;
|
|
|
+ in vec4 Kdi;
|
|
|
+ in vec4 Kai;
|
|
|
+ in vec2 texcoordi;
|
|
|
+ uniform sampler2D tex;
|
|
|
+ uniform float specular_exponent;
|
|
|
+ uniform float lighting_factor;
|
|
|
+ uniform float texture_factor;
|
|
|
+ out vec4 outColor;
|
|
|
+ void main()
|
|
|
+ {
|
|
|
+ vec3 Ia = La * vec3(Kai); // ambient intensity
|
|
|
+
|
|
|
+ vec3 light_position_eye = vec3 (view * vec4 (light_position_world, 1.0));
|
|
|
+ vec3 vector_to_light_eye = light_position_eye - position_eye;
|
|
|
+ vec3 direction_to_light_eye = normalize (vector_to_light_eye);
|
|
|
+ float dot_prod = dot (direction_to_light_eye, normal_eye);
|
|
|
+ float clamped_dot_prod = max (dot_prod, 0.0);
|
|
|
+ vec3 Id = Ld * vec3(Kdi) * clamped_dot_prod; // Diffuse intensity
|
|
|
+
|
|
|
+ vec3 reflection_eye = reflect (-direction_to_light_eye, normal_eye);
|
|
|
+ vec3 surface_to_viewer_eye = normalize (-position_eye);
|
|
|
+ float dot_prod_specular = dot (reflection_eye, surface_to_viewer_eye);
|
|
|
+ dot_prod_specular = float(abs(dot_prod)==dot_prod) * max (dot_prod_specular, 0.0);
|
|
|
+ float specular_factor = pow (dot_prod_specular, specular_exponent);
|
|
|
+ vec3 Is = Ls * vec3(Ksi) * specular_factor; // specular intensity
|
|
|
+ vec4 color = vec4(lighting_factor * (Is + Id) + Ia + (1.0-lighting_factor) * vec3(Kdi),(Kai.a+Ksi.a+Kdi.a)/3);
|
|
|
+ outColor = mix(vec4(1,1,1,1), texture(tex, texcoordi), texture_factor) * color;
|
|
|
+ if (fixed_color != vec4(0.0)) outColor = fixed_color;
|
|
|
+ }
|
|
|
+ )";
|
|
|
|
|
|
std::string overlay_vertex_shader_string =
|
|
|
- "#version 150\n"
|
|
|
- "uniform mat4 model;"
|
|
|
- "uniform mat4 view;"
|
|
|
- "uniform mat4 proj;"
|
|
|
- "in vec3 position;"
|
|
|
- "in vec3 color;"
|
|
|
- "out vec3 color_frag;"
|
|
|
-
|
|
|
- "void main()"
|
|
|
- "{"
|
|
|
- " gl_Position = proj * view * model * vec4 (position, 1.0);"
|
|
|
- " color_frag = color;"
|
|
|
- "}";
|
|
|
+R"(#version 150
|
|
|
+ uniform mat4 model;
|
|
|
+ uniform mat4 view;
|
|
|
+ uniform mat4 proj;
|
|
|
+ in vec3 position;
|
|
|
+ in vec3 color;
|
|
|
+ out vec3 color_frag;
|
|
|
+
|
|
|
+ void main()
|
|
|
+ {
|
|
|
+ gl_Position = proj * view * model * vec4 (position, 1.0);
|
|
|
+ color_frag = color;
|
|
|
+ }
|
|
|
+)";
|
|
|
|
|
|
std::string overlay_fragment_shader_string =
|
|
|
- "#version 150\n"
|
|
|
- "in vec3 color_frag;"
|
|
|
- "out vec4 outColor;"
|
|
|
- "void main()"
|
|
|
- "{"
|
|
|
- " outColor = vec4(color_frag, 1.0);"
|
|
|
- "}";
|
|
|
+R"(#version 150
|
|
|
+ in vec3 color_frag;
|
|
|
+ out vec4 outColor;
|
|
|
+ void main()
|
|
|
+ {
|
|
|
+ outColor = vec4(color_frag, 1.0);
|
|
|
+ }
|
|
|
+)";
|
|
|
|
|
|
std::string overlay_point_fragment_shader_string =
|
|
|
- "#version 150\n"
|
|
|
- "in vec3 color_frag;"
|
|
|
- "out vec4 outColor;"
|
|
|
- "void main()"
|
|
|
- "{"
|
|
|
- " if (length(gl_PointCoord - vec2(0.5)) > 0.5)"
|
|
|
- " discard;"
|
|
|
- " outColor = vec4(color_frag, 1.0);"
|
|
|
- "}";
|
|
|
+R"(#version 150
|
|
|
+ in vec3 color_frag;
|
|
|
+ out vec4 outColor;
|
|
|
+ void main()
|
|
|
+ {
|
|
|
+ if (length(gl_PointCoord - vec2(0.5)) > 0.5)
|
|
|
+ discard;
|
|
|
+ outColor = vec4(color_frag, 1.0);
|
|
|
+ }
|
|
|
+)";
|
|
|
|
|
|
init_buffers();
|
|
|
create_shader_program(
|