CHEN Yihui 5 жил өмнө
parent
commit
166cc49b3d
3 өөрчлөгдсөн 44 нэмэгдсэн , 20 устгасан
  1. 12 10
      fshader71.glsl
  2. 14 4
      main.cc
  3. 18 6
      vshader71.glsl

+ 12 - 10
fshader71.glsl

@@ -3,18 +3,20 @@
 
 in  vec4 color;
 in  vec2 texCoord;
-
+in  float fog_factor;
 out vec4 fColor;
 
 uniform sampler2D tex;
 
-void main() 
-{
-    if (texCoord.x > 10) {
-      fColor = vec4(0.2, 0.2, 0.2, 1);
-    }
-    else {
-      fColor = color * texture(tex, texCoord);
-    }
-} 
+void main() {
+  if (texCoord.x > 10) { // cow
+    fColor = vec4(0.1, 0.1, 0.1, 1);
+  }
+  else { // tex
+    fColor = color * texture(tex, texCoord);
+  }
 
+  // fog
+  vec4 fogColor = vec4(0.5, 0.5, 0.5, 1);
+  fColor = fColor * fog_factor + fogColor * (1 - fog_factor);
+} 

+ 14 - 4
main.cc

@@ -25,6 +25,11 @@ GLubyte image[TextureWidth][TextureHeight][3];
 point4 points[NumVertices];
 vec2 tex_coords[NumVertices];
 
+// fog params
+GLuint fog; // is_foggy uniform
+GLuint eye_pos;
+int foggy = 1;
+
 // Viewing transformation parameters
 GLfloat theta = 0.0;
 GLfloat phi = 0.0;
@@ -69,7 +74,8 @@ void load_model(const std::string &file_name, bool no_tex = false,
     while (s >> t) {
       if (t == "v") { // vertices
         s >> x >> y >> z;
-        vertices.emplace_back(x / 50.0f + x_offset, z / 50.0f + z_offset, y / 50.0f + y_offset, 1.0);
+        vertices.emplace_back(x / 50.0f + x_offset, z / 50.0f + z_offset,
+                              y / 50.0f + y_offset, 1.0);
       } else if (t == "vt") {
         s >> x >> y;
         tex_cods.emplace_back(x, y);
@@ -188,10 +194,11 @@ void init() {
   glUniform1i(glGetUniformLocation(program, "tex"), 0);
   model_view = glGetUniformLocation(program, "model_view");
   projection = glGetUniformLocation(program, "projection");
-
+  fog = glGetUniformLocation(program, "foggy");
+  eye_pos = glGetUniformLocation(program, "eye_pos");
   glEnable(GL_DEPTH_TEST);
 
-  glClearColor(1.0, 1.0, 1.0, 1.0);
+  glClearColor(1, 1, 1, 1);
 }
 
 void display(void) {
@@ -210,6 +217,10 @@ void display(void) {
   mat4 p = Frustum(left, right, bottom, top, zNear, zFar);
   glUniformMatrix4fv(projection, 1, GL_TRUE, p);
 
+  glUniform3f(eye_pos, eye_x, eye_y, eye_z);
+
+  glUniform1i(fog, foggy);
+
   glDrawArrays(GL_TRIANGLES, 0, NumVertices);
 
   glutSwapBuffers();
@@ -299,7 +310,6 @@ int main(int argc, char **argv) {
   glutKeyboardFunc(keyboard);
   glutMouseFunc(mouse);
   // glutIdleFunc(idle);
-
   glutMainLoop();
   return 0;
 }

+ 18 - 6
vshader71.glsl

@@ -5,13 +5,25 @@ in  vec2 vTexCoord;
 
 out vec4 color;
 out vec2 texCoord;
+out float fog_factor;
 
+uniform int foggy;
+uniform vec3 eye_pos;
 uniform mat4 model_view;
 uniform mat4 projection;
 
-void main() 
-{
-    color       = vec4(1, 1, 1, 1);
-    texCoord    = vTexCoord;
-    gl_Position = projection * model_view *  vPosition / vPosition.w;
-} 
+void main() {
+  color       = vec4(1.0, 1.0, 1.0, 1.0);
+  texCoord    = vTexCoord;
+  gl_Position = projection * model_view *  vPosition / vPosition.w;
+
+  // fog
+  if (foggy > 0) {
+    float dis = (vPosition.x - eye_pos.x) * (vPosition.x - eye_pos.x)
+              + (vPosition.y - eye_pos.y) * (vPosition.y - eye_pos.y)
+              + (vPosition.z - eye_pos.z) * (vPosition.z - eye_pos.z);
+    fog_factor = exp(-dis);
+  } else {
+    fog_factor = 1.0;
+  }
+}