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文件录制的太短了,效果不是很明显)
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!