# OpenGL project
**Repository Path**: guang-ming-fu/open-gl-project
## Basic Information
- **Project Name**: OpenGL project
- **Description**: 计算机图形学课程大作业
- **Primary Language**: Unknown
- **License**: AGPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2023-03-13
- **Last Updated**: 2024-12-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 2022_bit_cg_opengl
本项目是BIT 2022年图形学课程的期末大作业。
开发环境:Microsoft Visual Studio 2022 + OpenGL
## 一、项目介绍
### 1、场景介绍
本项目为海面太阳高升的场景。天空上有飞机,海面上有小船,接近海平线有一座金碧辉煌的宝塔,并且位于远处的物体被雾所遮挡。
### 2、交互介绍
**1.鼠标移动**
鼠标移动可以直接控制视角。
**2.鼠标滚轮滑动**
鼠标滚轮滑动可以直接对场景进行放大或缩小。
**3.按键操作**
按键w(↑)、a(←)、s(↓)、d(→)分别控制视点向上、左、下、右移动。
### 3、引用的第三方库
- `glad`库:用于访问opengl的规范化接口的第三方库。
- `GLFW`库:用于图形、窗口、渲染等的第三方库。
- `glm`库:用于进行向量和矩阵的数学计算。
- `assimp`库:读取和加载obj模型
- `stb_image.h`:用于读取图片
### 4、代码介绍
1.游戏控制器`GameController.h`:用于鼠键交互的控制。
- `updateGameController(GLFWwindow* window) `:在GLFW渲染循环中调用,用于处理逐帧的操作
2.照相机`camera.h`:用于控制调整观察视点。
成员变量:
- Position:相机坐标
- Front:相机前朝向向量
- Up:相机上朝向向量
- Right:相机右朝向向量
- Pitch:相机俯仰角
- Yaw:相机摇动角
3.地面`Floor.h`:绘制地面,并贴图。
4.天空盒`skyboxcube.h`:绘制天空盒作为背景。
5.网格`mesh.h`:将读入的模型绑定在网格上,实现模型的绘制和贴图。
6.模型加载`model.h`:读取obj文件,并加载模型的顶点、面、法向量、纹理等,并绘制模型。
7.着色器`shader.h`:编译、链接顶点着色器和片段着色器。
8.纹理`texture.h`:加载和绑定纹理
## 二、XML类图及主要方法注释
## 三、具体技术方案
#### 1. 光照计算
采用冯氏光照模型,光照效果考虑环境光照、漫反射光照和镜面光照。
- **环境光**:我们采用一个系数ambient来乘以光源的颜色作为环境光
```opengl
// ambient
vec3 ambient = light.ambient *
texture(material.diffuse, TexCoords).rgb;
```
- **漫反射**:该部分用来模拟光源对物体的方向性影响,即物体越是正对光源的面越亮,通过法向量和光线方向(点的位置和光源的位置)来计算漫反射光
```opengl
// diffuse
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(light.position - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = light.diffuse * diff *
texture(material.diffuse, TexCoords).rgb;
```
- **镜面反射**:该部分用来模拟光滑物体表面的高光,镜面反射的颜色更倾向于光照颜色
```opengl
// specular
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
vec3 specular = light.specular * spec *
texture(material.specular, TexCoords).rgb;
```
