百叶窗的实现原理:设置窗页宽度,2张纹理间隔采样。

顶点着色器:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;out vec2 TexCoord;
out vec4 FragColor;void main()
{gl_Position = vec4(aPos, 1.0);TexCoord = vec2(aTexCoord.x, 1-aTexCoord.y);FragColor=vec4(1.0);
}

片段着色器:

#version 330 coreuniform sampler2D texture0;
uniform sampler2D texture1;
uniform float unitWidth;
//窗页宽度 范围0-1
uniform float offset;
//显示窗页的编译系数 范围0-1
in vec4 FragColor;
in vec2 TexCoord;                    out vec4 color;void main()
{                                                                       float modPixel = mod(TexCoord[0], unitWidth);              float showPixel = offset* unitWidth;                   if (modPixel < showPixel)                                    {                                                       color = FragColor * texture2D(texture1, TexCoord);         }                                                           else                                                        {                                                           color = FragColor * texture2D(texture0, TexCoord);         }
}

完整代码:


#include "stdio.h"
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <soil/SOIL.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>#include <iostream>
#include "wrapperWindow.h"
#include "wrapperShader.h"
#include "data.h"
#include <windows.h>const int design_w = 800;
const int design_h = 600;int main()
{GLFWwindow *window = wrapperWindow(design_w, design_h).getWindow();auto m_shader = wrapperShader::createWithFilePath("blinds.vsh", "blinds.fsh");int arr_group_nun = 8;unsigned int indices[] = { // 注意索引从0开始! 0, 1, 3, // 第一个三角形1, 2, 3  // 第二个三角形};GLuint vao, vbo,ebo;glGenVertexArrays(1, &vao);glBindVertexArray(vao);glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, sizeof(rectArr), rectArr, GL_STATIC_DRAW);glGenBuffers(1, &ebo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, arr_group_nun* sizeof(GLfloat), (GLvoid *)0);glEnableVertexAttribArray(0);glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, arr_group_nun* sizeof(GLfloat), (GLvoid *)(6 * sizeof(GLfloat)));glEnableVertexAttribArray(2);glBindVertexArray(0);//--int w = 0, h = 0;GLuint texture0,texture1;glGenTextures(1, &texture0);glBindTexture(GL_TEXTURE_2D, texture0);unsigned char * img = SOIL_load_image("1.jpg", &w, &h, 0, SOIL_LOAD_RGB);//加载图片glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, img);//加载的图片数据 生成纹理glGenerateMipmap(GL_TEXTURE_2D);SOIL_free_image_data(img);glGenTextures(1, &texture1);glBindTexture(GL_TEXTURE_2D, texture1);img = SOIL_load_image("car.jpg", &w, &h, 0, SOIL_LOAD_RGB);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, img);glGenerateMipmap(GL_TEXTURE_2D);SOIL_free_image_data(img);glBindTexture(GL_TEXTURE_2D, 0);SYSTEMTIME now;int ratio = 400;while (!glfwWindowShouldClose(window)){glfwPollEvents();glClearColor(0.5f, 0.5f, 0.5f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);m_shader.useShaderProgram();m_shader.set1i("texture0", 0);m_shader.set1i("texture1", 1);glBindVertexArray(vao);glActiveTexture(GL_TEXTURE0);//激活纹理单元glBindTexture(GL_TEXTURE_2D, texture0);//绑定纹理单元glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D, texture1);m_shader.set1f("unitWidth", 0.1);//设置窗页宽度GetSystemTime(&now);int sur = now.wMilliseconds %ratio;float offset = sur*1.0 / ratio;m_shader.set1f("offset", 1-offset);//根据时间设置偏移系数glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);glBindVertexArray(0);glfwSwapBuffers(window);}glDeleteBuffers(1, &vao);glDeleteBuffers(1, &vbo);glDeleteBuffers(1, &ebo);glfwTerminate();return 0;
}

效果图:

opengl实现百叶窗效果相关推荐

  1. OpenGL水波纹效果

    OpenGL水波纹效果 glsl水波纹效果,可使用shadertoy直接运行.sin和iTime配合得到水波纹mask,通过mask流动变化得到水波纹效果. 脚本1 #iChannel0 " ...

  2. 百叶窗设计原理 html5,Html5百叶窗效果的示例代码_html5教程技巧

    本篇文章主要介绍了Html5百叶窗效果的示例代码,小编觉得挺不错的,现在分享给大家HTML5源码和解释,也给大家做个参考.对HTML5感兴趣的小伙伴可以一起跟随小编过来看看吧 本文介绍了Html5百叶 ...

  3. Android魔法(第四弹)—— 一步步实现百叶窗效果

    目录 1.效果展示 2.实现AnimationViewInterface接口 3.解析动画组成 4.翻转单元--RotateView 1)前景背景图 2)实现翻转 3)实现翻转动画 5.百叶窗--Bl ...

  4. html图片百叶窗轮播,纯js百叶窗效果轮播图插件

    这是一款纯js百叶窗效果轮播图插件.该js轮播图在图片切换时的效果类似于多张图片展开合成一张完整的大图.该轮播图由纯js编写,兼容ie8浏览器. 使用方法 在页面中引入imgSwitch.min.js ...

  5. css实现图片百叶窗效果

    作品很翻车啊: 用css实现了一款百叶窗效果,但是不知道图片不能完全显出来,有谁知道怎样使大的图片自适应小窗口吗,太难了爬... 后续更新一下:只需在css中加入: img{width: 805px; ...

  6. 图片显示特效之百叶窗效果

    背景 自己闲来无事的时候,常会使用VS开发一些小游戏,游戏功能做得比较单一,不是很复杂.游戏虽小,但也算是五脏俱全,有游戏初始画面.游戏画面.游戏结束画面等.对于,游戏的初始界面,我就通常使用百叶窗效 ...

  7. 网页图片实现百叶窗效果

    网页图片实现百叶窗效果 制作 或者观看过幻灯片的网友,一定不会对幻灯片的切换效果感到陌生,垂直百叶窗式.纵向棋盘式等切换效果是否让你还记忆犹新呢?其实我们也可以把网页中的图片做出这种效果. 预想效果: ...

  8. html实现百叶窗效果

    html实现百叶窗效果 原理很简单就是相当于把图片分成n份开始轮播,下面开始上代码并解析其步骤 style中的代码 * {margin: 0px;padding: 0px;}/*当然这里要用到绝对定位 ...

  9. 如何用css实现百叶窗效果

    1.效果图 利用纯css实现百叶窗效果 效果如下: 2.代码如下: 1.创建一个div 2.设置无序列表,插入事先准备好的图片 ​ <!DOCTYPE html> <html lan ...

最新文章

  1. Jmeter(七)-参数化
  2. 求助帖:android开发初期:为什么我在活动二设置的singInstance模式跑到活动三去了???
  3. Flex不支持SOAP1.2
  4. An unspecified error occurred!
  5. VMware vSphere 6.0 虚拟机运维常见问题排除
  6. OpenCV--fstream格式化读取坐标数据存为vector
  7. python中stacked_python – Django管理员StackedInline定制
  8. javascript学习之数组的使用一 push pop shift unshift 方法
  9. 可代替 ASM,使用 AnnotationProcessor 做代码插桩
  10. Element属性:scrollHeight,clientHeight,offsetHeight区别
  11. Tableau学习教程(万字保姆级教程)​​​​​​
  12. 基于FPGA的YCbCr颜色空间中颜色参数的变化
  13. 解读 AppStore 新功能:自定义产品页面和 A/B Test 工具
  14. 本地差分隐私 随机响应_本地化差分隐私:如何面对非可信的世界
  15. Android中的保活机制
  16. 实验室:通过混淆文件扩展名上传 Web shell
  17. php ftp报错,ftp工具链接报错530错误详解
  18. 《经济学300年》精髓:经济学是如何从“重商主义”过渡到劳动价值论,又发展到“边际主义”的?
  19. 适合给女性朋友过生日时发的祝福短信
  20. win10网络有线连接频繁自动断开解决方法

热门文章

  1. 【ROS实践入门(六)消息msg和服务srv文件创建与使用】
  2. 2023年7月十大热门后端编程语言排行榜
  3. 如何建立属于自己的云服务器
  4. Matlab/Simulink快捷键
  5. 2022年游戏出海行业研究报告丨游戏出海投放公司
  6. wordpress标签大全
  7. 怎么取消苹果手机自动续费_手机QQ会员每月自动续费,怎么关闭
  8. redis的安装与应用
  9. matlab编程mindlin解,MATLAB对mindlin解进行三重积分
  10. Android 实现类似Excel表格,且表格能左右、上下滑动,可修改分割线颜色