OpenGL结合水池模型的动态水面实战

写在一次计算机图形学Project后的回顾

 


  摘要:通过光照贴图(漫反射贴图)绘制为静态水面和水池模型添加纹理和光照,通过正弦波叠加的物理模型实现动态水面震动的效果!


  • 注1:由于代码的很多部分都添加了汉语注释,因而对注释已注明的一般将不再进行单独解释与说明。此外每一部分的代码实现也只是将核心代码而非所有代码在此处中进行说明(完整程序代码及涉及到的着色器代码和图片已上传到GitHub,请点击此处查看)!
  • 注2:如无特殊说明,以下所指的本程序均指本次实验的CGProject1程序!
     

 
 

一:水池实现

水池部分主要借鉴learnopengl当中的model_loading与lighting_maps两个程序
 
1-1.首先实现obj**模型加载**,这主要是利用assimp库封装好的加载函数来实现的,该部分仿照model_loading而实现,相应的关键部分代码所示:

//加载pool.obj水池模型
Model ourModel("pool.obj");
...

glm::mat4 model;
// 转换它(模型坐标)使得其(模型)可以同时(在程序初始运行时)被我们观察到正面和顶部
model = glm::translate(model, glm::vec3(0.0f, -1.75f, -2.0f));
// 缩小模型规模使其在场景中显得更加真实
model = glm::scale(model, glm::vec3(0.4f, 0.4f, 0.4f));
glUniformMatrix4fv(glGetUniformLocation(lightingShader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model));
//绘制已加载的模型
ourModel.Draw(lightingShader);

 
1-2.接下来调整背景色(即池子与水面之外的部分)为浅灰色:

glClearColor(0.2f, 0.2f, 0.2f, 1.0f); //将背景设置为浅灰色
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 
1-3.接下来仿照lighting_maps中的代码(需要注意的是lighting_maps程序是同时添加了漫反射贴图与镜面贴图的,本程序为了简单起见,只使用了漫反射贴图),为水池添加一个漫反射光照贴图,关键部分代码如下所示:

// 水池与水面模型着色器,共用着色器可以有效减少代码冗余
Shader lightingShader("lighting_maps.vs", "lighting_maps.frag");

// 加载贴图
GLuint diffuseMap, diffuseMap2;
glGenTextures(1, &diffuseMap);
glGenTextures(1, &diffuseMap2);
int width, height;
unsigned char* image, *image2;

// 漫反射贴图,其实就相当于给我们的水池外边贴上一幅图片,使其看起来像是“木质”的
//水池贴图
image = SOIL_load_image("pool_map.png", &width, &height, 0, SOIL_LOAD_RGB);
glBindTexture(GL_TEXTURE_2D, diffuseMap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
SOIL_free_image_data(image);

//纹理过滤函数,也即是将图象从纹理空间映射到帧缓冲空间
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值