若该文为原创文章,未经容许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108602694
红瘦子(红模拟)的博文大全:开发技术汇合(蕴含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中…(点击传送门)
Qt开发专栏:三方库开发技术(点击传送门)
上一篇:《SDL开发笔记(二):音频根底介绍、应用SDL播放音频》
下一篇:敬请期待
前言
对于Qt利用来说,为了更大的跨平台通用性,应用SDL播放音频,同样也风行应用SDL渲染视频,基本上很大一部分市面上的sdk播放器都是基于sdl的,传入窗口句柄应用sdl渲染。
Demo
循环渲染色彩:
按键渲染色彩:
按键渲染图片:
SDL渲染流程解析
根本流程如下:
步骤一:初始化子系统
SDL_Init()初始化视频零碎,其余多余的零碎不必初始化。
步骤二:创立窗口
SDL_CreateWindow()创立windows窗口,设置一些罕用属性。
步骤三:创立渲染器(与窗口绑定)
SDL_CreateRenderer()创立渲染器,该渲染器创立时曾经与显示的窗口进行了绑定。
步骤四:渲染色彩/渲染图片步骤
本篇有3个demo,别离为渲染了简略的色彩,同构按键工夫渲染不同的色彩,通过按键渲染不同的图片。
渲染简略的色彩:设置渲染色彩->清空->渲染
// 步骤四:开始渲染-渲染简略的色彩for(int index = 0; index < 100000; index++){ SDL_SetRenderDrawColor(pSDLRenderer, index/255%255, index/10%255, index/20%255, 128); SDL_RenderClear(pSDLRenderer); SDL_RenderPresent(pSDLRenderer); SDL_PollEvent(&event);}
按键渲染简略的色彩:设置渲染色彩->清空->渲染->按键不同的色彩
// 步骤四:开始渲染-渲染简答的色彩,承受按键输出0~9对应不同的色彩,// 对键盘事件进行解决bool out = false;int r = 0;int g = 0;int b = 0;while(true){ SDL_SetRenderDrawColor(pSDLRenderer, r, g, b, 255); SDL_RenderClear(pSDLRenderer); SDL_RenderPresent(pSDLRenderer); SDL_PollEvent(&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: out = true; break; case SDLK_1: r = 255; g = 0; b = 0; break; case SDLK_2: r = 0; g = 255; b = 0; break; case SDLK_3: r = 0; g = 0; b = 255; break; case SDLK_4: r = 255; g = 255; b = 0; break; case SDLK_5: r = 0; g = 255; b = 255; break; case SDLK_6: r = 255; g = 0; b = 255; break; case SDLK_7: r = 255; g = 255; b = 255; break; case SDLK_8: r = 255; g = 140; b = 0; break; case SDLK_9: r = 0; g = 191; b = 255; break; case SDLK_0: r = 255; g = 215; b = 0; break; default: break; } break; case SDL_QUIT: out = true; break; default: break; } if(out) { break; }}
渲染图片:加载图片->创立纹理->清空->复制纹理到渲染->渲染。
// 步骤四:开始渲染-渲染bmp图片,1-2两张图片SDL_Surface *pSDLSurface = 0;SDL_Texture *pSDLTexture = 0;SDL_Surface *pSDLSurface2 = 0;SDL_Texture *pSDLTexture2 = 0;SDL_Texture *pSDLTextureTemp = 0; // 用于长期寄存bool out = false;pSDLSurface = SDL_LoadBMP("testBMP/1.bmp");pSDLTexture = SDL_CreateTextureFromSurface(pSDLRenderer, pSDLSurface);pSDLSurface2 = SDL_LoadBMP("testBMP/2.bmp");pSDLTexture2 = SDL_CreateTextureFromSurface(pSDLRenderer, pSDLSurface2);pSDLTextureTemp = pSDLTexture;while(true){ // 清空渲染器 SDL_RenderClear(pSDLRenderer); // 将问题copy到渲染器上 SDL_RenderCopy(pSDLRenderer, pSDLTextureTemp, 0, 0); // 显示渲染器内容 SDL_RenderPresent(pSDLRenderer); // 事件处理 SDL_PollEvent(&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: out = true; break; case SDLK_1: pSDLTextureTemp = pSDLTexture; break; case SDLK_2: pSDLTextureTemp = pSDLTexture2; break; default: break; } break; case SDL_QUIT: out = true; break; default: break; } if(out) { break; }}
步骤五:销毁渲染器
SDL_DestroyRenderer();
步骤六:销毁窗口
SDL_DestroyWindow();
步骤七:退出SDL零碎
SDL_Quit();
SDL渲染相干变量
SDL_Window
用于标识窗口。
SDL_Renderer
示意出现状态的构造。
typedef struct SDL_Surface{ Uint32 flags; /**< Read-only */ SDL_PixelFormat *format; /**< Read-only */ int w, h; /**< Read-only */ int pitch; /**< Read-only */ void *pixels; /**< Read-write */ /** Application data associated with the surface */ void *userdata; /**< Read-write */ /** information needed for surfaces requiring locks */ int locked; /**< Read-only */ void *lock_data; /**< Read-only */ /** clipping information */ SDL_Rect clip_rect; /**< Read-only */ /** info for fast blit mapping to other surfaces */ struct SDL_BlitMap *map; /**< Private */ /** Reference count -- used when freeing surface */ int refcount; /**< Read-mostly */} SDL_Surface;
SDL_Event
SDL的事件系统结构体,博大精深,当前趣味能够认真钻研,按键次要用到了其type,而后键值用到的是其key.keysym.sym。
switch (event.type){case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: out = true; break; default: ; }}
SDL_Surface
在软件blitting中应用的像素汇合,此构造应被视为只读,但像素除外,如果不为空,则蕴含外表的原始像素数据。
typedef struct SDL_Surface{ Uint32 flags; /**< Read-only */ SDL_PixelFormat *format; /**< Read-only */ int w, h; /**< Read-only */ int pitch; /**< Read-only */ void *pixels; /**< Read-write */ /** Application data associated with the surface */ void *userdata; /**< Read-write */ /** information needed for surfaces requiring locks */ int locked; /**< Read-only */ void *lock_data; /**< Read-only */ /** clipping information */ SDL_Rect clip_rect; /**< Read-only */ /** info for fast blit mapping to other surfaces */ struct SDL_BlitMap *map; /**< Private */ /** Reference count -- used when freeing surface */ int refcount; /**< Read-mostly */} SDL_Surface;
SDL_Texture
纹理,像素数据的一种高效的特定示意。
SDL渲染相干函数原型
SDL_Init()
int SDLCALL SDL_Init(Uint32 flags);
应用此函数初始化SDL库,必须在应用大多数其余SDL函数之前调用它,初始化的时候尽量做到“够用就好”,而不要用SDL_INIT_EVERYTHING。会呈现一些不可预知的问题。
- 参数一:输出初始化的设施
SDL_CreateWindow()
SDL_Window * SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags);
应用指定的地位、尺寸和标记创立一个窗口。
后面5个参数都是罕用的,第六个参数是窗口的属性,如是否可扭转大小等等.
SDL_CreateRenderer()
SDL_Renderer * SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags);
为窗口创立二维渲染上下文,参数一为咱们之前须要渲染的窗口。
SDL_SetRenderDrawColor()
int SDLCALL SDL_SetRenderDrawColor(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
设置用于绘图操作的色彩(矩形、直线和革除)。
SDL_RenderClear()
int SDL_RenderClear(SDL_Renderer * renderer);
应用绘图色彩革除以后渲染指标。
SDL_RenderPresent()
void SDL_RenderPresent(SDL_Renderer * renderer);
应用已执行的渲染更新屏幕。
SDL_PollEvent()
int SDL_PollEvent(SDL_Event * event);
以后挂起事件的轮询。
SDL_LoadBMP()
#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1)SDL_Surface * SDL_LoadBMP_RW(SDL_RWops * src, int freesrc);
从可查找的SDL数据流(内存或文件)加载外表数据。
SDL_CreateTextureFromSurface()
SDL_Texture * SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface);
从现有外表创立纹理。
- 参数一:绑定窗口的渲染器。
- 参数二:加载文件后的外表数据(加载的图片)。
SDL_RenderCopy()
int SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect);
将纹理的一部分复制到以后渲染指标。
- 参数一:应该复制纹理局部的渲染器。
- 参数二:源纹理
- 参数三:指向源矩形的指针,设置为0则全副。
- 参数四:指向指标矩形的指针,设置为0则全副。
SDL_DestroyRenderer()
void SDL_DestroyRenderer(SDL_Renderer * renderer);
销毁渲染器。
SDL_DestroyWindow()
void SDL_DestroyWindow(SDL_Window * window);
销毁窗口。
SDL_Quit()
void SDL_Quit(void);
此函数用于革除所有初始化的子系统。在所有退出条件后调用它。
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108602694
Demo源码
void SDLManager::testRenderWindow(){ int ret = 0; SDL_Window *pSDLWindow = 0; SDL_Renderer *pSDLRenderer = 0; SDL_Event event; // 步骤一:初始化视频子系统 ret = SDL_Init(SDL_INIT_VIDEO); if(ret) { LOG << "Failed"; return; } // 步骤二:创立窗口,反对opengl、大小可变 pSDLWindow = SDL_CreateWindow("SDL Widget", 0, 0, 800, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); if(!pSDLWindow) { LOG << "Failed"; return; } // 步骤三:基于窗口创立渲染器 pSDLRenderer = SDL_CreateRenderer(pSDLWindow, -1, 0); if(!pSDLRenderer) { LOG << "Failed"; return; }#if 0 // 步骤四:开始渲染-渲染简略的色彩 for(int index = 0; index < 100000; index++) { SDL_SetRenderDrawColor(pSDLRenderer, index/255%255, index/10%255, index/20%255, 128); SDL_RenderClear(pSDLRenderer); SDL_RenderPresent(pSDLRenderer); SDL_PollEvent(&event); }#endif#if 0 // 步骤四:开始渲染-渲染简答的色彩,承受按键输出0~9对应不同的色彩, // 对键盘事件进行解决 bool out = false; int r = 0; int g = 0; int b = 0; while(true) { SDL_SetRenderDrawColor(pSDLRenderer, r, g, b, 255); SDL_RenderClear(pSDLRenderer); SDL_RenderPresent(pSDLRenderer); SDL_PollEvent(&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: out = true; break; case SDLK_1: r = 255; g = 0; b = 0; break; case SDLK_2: r = 0; g = 255; b = 0; break; case SDLK_3: r = 0; g = 0; b = 255; break; case SDLK_4: r = 255; g = 255; b = 0; break; case SDLK_5: r = 0; g = 255; b = 255; break; case SDLK_6: r = 255; g = 0; b = 255; break; case SDLK_7: r = 255; g = 255; b = 255; break; case SDLK_8: r = 255; g = 140; b = 0; break; case SDLK_9: r = 0; g = 191; b = 255; break; case SDLK_0: r = 255; g = 215; b = 0; break; default: break; } break; case SDL_QUIT: out = true; break; default: break; } if(out) { break; } }#endif#if 1 // 步骤四:开始渲染-渲染bmp图片,1-2两张图片 SDL_Surface *pSDLSurface = 0; SDL_Texture *pSDLTexture = 0; SDL_Surface *pSDLSurface2 = 0; SDL_Texture *pSDLTexture2 = 0; SDL_Texture *pSDLTextureTemp = 0; // 用于长期寄存 bool out = false; pSDLSurface = SDL_LoadBMP("testBMP/1.bmp"); pSDLTexture = SDL_CreateTextureFromSurface(pSDLRenderer, pSDLSurface); pSDLSurface2 = SDL_LoadBMP("testBMP/2.bmp"); pSDLTexture2 = SDL_CreateTextureFromSurface(pSDLRenderer, pSDLSurface2); pSDLTextureTemp = pSDLTexture; while(true) { // 清空渲染器 SDL_RenderClear(pSDLRenderer); // 将问题copy到渲染器上 SDL_RenderCopy(pSDLRenderer, pSDLTextureTemp, 0, 0); // 显示渲染器内容 SDL_RenderPresent(pSDLRenderer); // 事件处理 SDL_PollEvent(&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: out = true; break; case SDLK_1: pSDLTextureTemp = pSDLTexture; break; case SDLK_2: pSDLTextureTemp = pSDLTexture2; break; default: break; } break; case SDL_QUIT: out = true; break; default: break; } if(out) { break; } }#endif // 步骤五:销毁渲染器 SDL_DestroyRenderer(pSDLRenderer); // 步骤六:销毁窗口 SDL_DestroyWindow(pSDLWindow); // 步骤七:退出SDL SDL_Quit();}
工程模板:对应版本号v1.2.0
对应版本号v1.2.0:按键渲染色彩和BMP图片
上一篇:《SDL开发笔记(二):音频根底介绍、应用SDL播放音频》
下一篇:敬请期待
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108602694