CHEN Yihui 5 years ago
parent
commit
c9d086a021
4 changed files with 49 additions and 15 deletions
  1. 2 2
      fshader71.glsl
  2. 33 7
      main.cc
  3. 12 5
      readme.txt
  4. 2 1
      vshader71.glsl

+ 2 - 2
fshader71.glsl

@@ -15,7 +15,7 @@ in vec3 fE1;
 out vec4 fColor;
 
 uniform sampler2D tex;
-
+uniform float obj_shi;
 uniform float plane_light_on;
 
 void main() {
@@ -28,7 +28,7 @@ void main() {
     material_ambient = fColor;
     material_diffuse = vec4(1.0, 0.8, 0.0, 1.0);
     material_specular = vec4(1.0, 0.0, 1.0, 1.0);
-    material_shininess = 50.0;
+    material_shininess = obj_shi; // cow's shininess
   } else { // tex
     fColor = texture(tex, texCoord);
     material_ambient = fColor;

+ 33 - 7
main.cc

@@ -3,7 +3,7 @@
 #include <iostream>
 #include <vector>
 
-#define PARAMS_DEBUG_PRINT false
+#define PARAMS_DEBUG_PRINT true
 
 const int texNumTriangles = 64770;
 const int cowNumTriangles = 5804;
@@ -38,6 +38,13 @@ GLuint fog; // is_foggy uniform
 GLuint eye_pos;
 int foggy = 1;
 
+GLuint fog_fac;
+float fogFac = 1.0f;
+
+// object (cow) params
+GLuint obj_shi;
+float objShi = 50.0f;
+
 // Viewing transformation parameters
 GLfloat theta = 0.0;
 GLfloat phi = 0.0;
@@ -246,6 +253,8 @@ void init() {
   fog = glGetUniformLocation(program, "foggy");
   eye_pos = glGetUniformLocation(program, "eye_pos");
   plane_light = glGetUniformLocation(program, "plane_light_on");
+  fog_fac = glGetUniformLocation(program, "fog_fac");
+  obj_shi = glGetUniformLocation(program, "obj_shi");
   glEnable(GL_DEPTH_TEST);
 
   glClearColor(1, 1, 1, 1);
@@ -273,6 +282,10 @@ void display(void) {
 
   glUniform1f(plane_light, light_on);
 
+  glUniform1f(fog_fac, fogFac);
+
+  glUniform1f(obj_shi, objShi);
+
   glDrawArrays(GL_TRIANGLES, 0, NumVertices);
 
   glutSwapBuffers();
@@ -307,6 +320,24 @@ void keyboard(unsigned char key, int mousex, int mousey) {
       foggy = 1;
     }
     break;
+  case 'k':
+    objShi -= 1.0f;
+    if (objShi < 0.0f) {
+      objShi = 0.0f;
+    }
+    break;
+  case 'K':
+    objShi += 1.0f;
+    break;
+  case 'g':
+    fogFac -= 0.1;
+    if (fogFac < 0) {
+      fogFac = 0;
+    }
+    break;
+  case 'G':
+    fogFac += 0.1;
+    break;
   case '1':
     tau += 0.01;
     break;
@@ -319,12 +350,6 @@ void keyboard(unsigned char key, int mousex, int mousey) {
   case 'e':
     theta -= 0.01;
     break;
-  case 'A':
-    at_x += 0.01;
-    break;
-  case 'D':
-    at_x -= 0.001;
-    break;
   case 'w':
     eye_x += 0.01;
     break;
@@ -351,6 +376,7 @@ void keyboard(unsigned char key, int mousex, int mousey) {
     break;
   }
   if (PARAMS_DEBUG_PRINT) {
+    printf("obj_shi:%f\n", objShi);
     printf("eye_x,y,z:%f, %f, %f, %f\n", eye_x, eye_y, eye_z, eye_w);
     printf("at_x,y,z:%f, %f, %f, %f\n", at_x, at_y, at_z, at_w);
   }

+ 12 - 5
readme.txt

@@ -18,10 +18,16 @@
       ./build_run.sh
   操作
     w,a,s,d:控制观察者x,y位置(和看的方向等没关系)
+    q,e:控制看的水平方向
     9,6:控制观察者z位置(升降)
     8,5:控制看的俯仰
     1,3:控制观察者的侧看
     f:切换雾开关
+    G:雾模型距离衰减系数变大
+    g:雾模型距离衰减系数变小
+    l:开关飞机上的灯
+    k:减小物体(牛)的高光系数
+    K:增大物体(牛)的高光系数
 实现技术
   地形绘制
     使用了gc_tex,把坐标缩小到1/50,地形没有颜色,有纹理
@@ -34,17 +40,18 @@
     设置了物体cow,把坐标缩小到1/50,物体没有纹理,没有颜色,
     物体的纹理坐标都设成一个特殊坐标,
     在片段着色器中增加判断(区分地形和物体),如果纹理坐标是特殊坐标,则涂特殊的颜色
+    物体材料属性:
   光照
-    光照1:随飞机移动,点光源
+    光照1:随飞机移动,点光源,使用l键开关
     光照2:在地图中心上方,平行光源
     顶点法向用cpu预先计算,存在glBuffer里,
-    (在每个三角形的顶点法相是相同的,但计算镜面光时的向量对于每个顶点是不同的)
-    光的参数,材料参数写在片段着色器里,
-    假设材料参数对两种光相同,其中地形没有镜面光,牛有较高的镜面光
+    光的参数,地形的材料参数写在片段着色器里,
+    牛的高光系数可以配置,通过kK键调整
     使用uniform变量,传输是否有雾(int),及眼睛位置(vec3)到顶点着色器,
     在顶点着色器里根据距离(的平方)计算雾化参数(使用指数),若没雾直接输出雾化参数1
-    在片段着色器里计算雾化效果,雾的颜色写在片段着色器里
+    在片段着色器里计算雾化效果,雾的颜色固定写在片段着色器里
+    雾的距离衰减参数可以配置
   模型的数据结构,效率和交互
     对于顶点,纹理坐标,纹素,颜色的数据上面已经说明
     对于碰撞检测使用cpu计算,在二维数组[128][256]中存放地形高度z,

+ 2 - 1
vshader71.glsl

@@ -15,6 +15,7 @@ out vec3 fE1;
 out vec3 fL1;
 
 uniform int foggy;
+uniform float fog_fac;
 uniform vec3 eye_pos;
 uniform mat4 model_view;
 uniform mat4 projection;
@@ -40,7 +41,7 @@ void main() {
     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);
+    fog_factor = exp(-dis * fog_fac);
   } else { // not foggy
     fog_factor = 1.0;
   }