SDL2+OpenGL (4)混合图像产生动态效果

利用OpenGL的glBlendFunc函数将下面这张图作为纹理产生动态效果

 1  #include <GL/glew.h>
 2  #include <SDL2/SDL.h>
 3  #include <SDL2/SDL_opengl.h>
 4  #include <SDL2/SDL_image.h>
 5  bool quit;
 6  SDL_Window* window;
 7  SDL_GLContext glContext;
 8  SDL_Event sdlEvent;
 9  GLuint      texture;
10  float x=0,y=0;
11  void Init()
12  {
13      SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
14      SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
15      SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,32);
16      SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
17      SDL_Init(SDL_INIT_EVERYTHING);
18      window = SDL_CreateWindow("SDL+OpenGL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,600,600,SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN );
19      glContext = SDL_GL_CreateContext(window);
20      SDL_GL_SetSwapInterval(1);
21      glewInit();
22      glEnable(GL_TEXTURE_2D);
23      glClearDepth(1.0f);
24      glDepthFunc(GL_LEQUAL);
25      glEnable(GL_DEPTH_TEST);
26      glShadeModel(GL_SMOOTH);
27  }
28  void LoadImage()
29  {
30      SDL_Surface *tmp=IMG_Load("water.png");
31      tmp = SDL_ConvertSurfaceFormat(tmp,SDL_PIXELFORMAT_ABGR8888,0);
32      texture=gluBuild2DMipmaps(GL_TEXTURE_2D,4,tmp->w,tmp->h,GL_RGBA,GL_UNSIGNED_BYTE,tmp->pixels);
33      SDL_FreeSurface(tmp);
34  }
35  void Draw()
36  {
37      if(x>=5)  x=0;
38      if(y>=5)  y=0;
39      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
40      glLoadIdentity();
41      glScaled(1.0f/10,1.0f/10,1.0f/10);
42
43      glPushMatrix();
44          glEnable(GL_BLEND);
45              glColor4f(1.0f,1.0f,1.0f,0.5f);
46              glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
47              glTranslatef(0.0f, 0.0f, 1.0f);
48              glBindTexture(GL_TEXTURE_2D,texture);
49              glBegin(GL_QUADS);
50                  glTexCoord2f(5.0f+x, 5.0f+y); glVertex3f(-10.0f,  10.0f,  0.0f);
51                  glTexCoord2f(5.0f+x, 0.0f+y); glVertex3f( 10.0f,  10.0f,  0.0f);
52                  glTexCoord2f(0.0f+x, 0.0f+y); glVertex3f( 10.0f, -10.0f,  0.0f);
53                  glTexCoord2f(0.0f+x, 5.0f+y); glVertex3f(-10.0f, -10.0f,  0.0f);
54              glEnd();
55          glDisable(GL_BLEND);
56      glPopMatrix();
57
58      glPushMatrix();
59          glEnable(GL_BLEND);
60              glColor4f(1.0f,1.0f,1.0f,0.6f);
61              glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_CONSTANT_ALPHA);
62              glTranslatef(0.0f, 0.0f, 0.0f);
63              glBindTexture(GL_TEXTURE_2D,texture);
64              glBegin(GL_QUADS);
65                  glTexCoord2f(5.0f-x, 5.0f-y); glVertex3f(-10.0f,  10.0f,  0.0f);
66                  glTexCoord2f(5.0f-x, -5.0f-y); glVertex3f( 10.0f,  10.0f,  0.0f);
67                  glTexCoord2f(0.0f-x, -5.0f-y); glVertex3f( 10.0f, -10.0f,  0.0f);
68                  glTexCoord2f(0.0f-x, 5.0f-y); glVertex3f(-10.0f, -10.0f,  0.0f);
69              glEnd();
70          glDisable(GL_BLEND);
71      glPopMatrix();
72
73      x+=0.005;
74      y+=0.005;
75      SDL_GL_SwapWindow(window);
76  }
77  int main(int argc, char *argv[])
78  {
79      quit = false;
80      Init();
81      LoadImage();
82      while (!quit)
83      {
84          while(SDL_PollEvent(&sdlEvent))
85          {
86              if(sdlEvent.type == SDL_QUIT)
87              {
88                  quit = true;
89              }
90          }
91          Draw();
92          SDL_Delay(16);
93      }
94      SDL_DestroyWindow(window);
95      window = NULL;
96      SDL_Quit();
97      return 0;
98  }

效果(gif文件录制的太短了,效果不是很明显)

时间: 2024-08-10 19:04:37

SDL2+OpenGL (4)混合图像产生动态效果的相关文章

Atitti 图像处理 图像混合 图像叠加&#160;blend 原理与实现

Atitti 图像处理 图像混合 图像叠加 blend 原理与实现 混合模式 编辑 本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 混合模式是图像处理技术中的一个技术名词,不仅用于广泛使用的Photoshop中,也应用于AfterEffect.llustrator . Dreamweaver. Fireworks等软件.主要功效是可以用不同的方法将对象颜色与底层对象的颜色混合.当您将一种混合模式应用于某一对象时,在此对象的图层或组下方的任何对象上都可看到混合模式的效果.

Pangolin中opengl的混合(gl_blend)

Blend 混合是将源色和目标色以某种方式混合生成特效的技术.混合常用来绘制透明或半透明的物体.在混合中起关键作用的α值实际上是将源色和目标色按给定比率进行混合,以达到不同程度的透明.α值为0则完全透明,α值为1则完全不透明.混合操作只能在RGBA模式下进行,颜色索引模式下无法指定α值.物体的绘制顺序会影响到OpenGL的混合处理. glEnable( GL_BLEND );   // 启用混合 glDisable( GL_BLEND );  // 禁用关闭混合 获得混合的信息 glGet( G

SDL2+OpenGL (2)绘制立体图形

绘制正四面体,即从四个面依次绘制三角形,其他立体图形方法类似 1 #include <GL/glew.h> 2 #include <SDL2/SDL.h> 3 #include <SDL2/SDL_opengl.h> 4 5 bool quit; 6 SDL_Window* window; 7 SDL_GLContext glContext; 8 SDL_Event sdlEvent; 9 GLfloat rtri=0; 10 bool Init() 11 { 12 S

SDL2+OpenGL (1)绘制多边形

1 #include <GL/glew.h> 2 #include <SDL2/SDL.h> 3 #include <SDL2/SDL_opengl.h> 4 5 bool quit; 6 SDL_Window* window; 7 SDL_GLContext glContext; 8 SDL_Event sdlEvent; 9 bool Init() 10 { 11 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3

Android显示系统设计框架介绍

1. Linux内核提供了统一的framebuffer显示驱动,设备节点/dev/graphics/fb*或者/dev/fb*,以fb0表示第一个显示屏,当前实现中只用到了一个显示屏. 2. Android的HAL层提供了Gralloc,分为fb和gralloc两个设备.设备fb负责打开内核中的framebuffer以及提供post. setSwapInterval等操作,设备gralloc则负责管理帧缓冲区的分配和释放.上层只能通过Gralloc访问帧缓冲区,这样一来就实现了 有序的封装保护.

【OpenCV入门教程之四】 ROI区域图像叠加&amp;初级图像混合 全剖析(转)

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20911629 作者:毛星云(浅墨)    邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.8 在这篇文章里,我们一起学习了在OpenCV中如何定义感兴趣区域ROI,如何使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像

opencv学习笔记-图像叠加、混合

在图像处理中,目标区域定义为感兴趣区域ROI(region of Interest),这是后期图像处理的基础,在获取ROI后,进行一些列的处理.ROI区域在Opencv中就是Rect,先构建Rect,然后给予ROI一些特点,形成了图像掩膜. 一.ROI创建 //定义一个Mat类型并给其设定ROI区域 Mat imageROI; //方法一 imageROI=image(Rect(500,250,logo.cols,logo.rows)); //方法二 imageROI=Image(Range(2

opengl 反走样 混合 多重采样 blend multisample

1. 反走样         在光栅图形显示器上绘制非水平且非垂直的直线或多边形边界时,或多或少会呈现锯齿状或台阶状外观.这是因为直线.多边形.色彩边界等是连续的,而光栅则是由离散的点组成,在光栅显示设备上表现直线.多边形等,必须在离散位置采样.由于采样不充分重建后造成的信息失真,就叫走样(aliasing).而用于减少或消除这种效果的技术,就称为反走样(antialiasing). 2. OpenGL反走样的实现 OpengL中的反走样采用的是融合的技术,来实现点.线和图形的边沿以及雾和颜色和

基于OpenGL编写一个简易的2D渲染框架-04 绘制图片

阅读文章前需要了解的知识,纹理:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 过程简述:利用 FreeImage 库加载图像数据,再创建 OpenGL 纹理,通过 Canvas2D 画布绘制,最后又 Renderer 渲染器渲染 本来想用 soil 库加载图像数据的,虽然方便,但是加载有些格式的图像文件时会出现一些问题.最后,改用 FreeImage 库来加载图像了. 添加 FreeImage 库到工