IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> SDL渲染应用(1) -> 正文阅读

[C++知识库]SDL渲染应用(1)

SDL渲染应用(1)

基本流程

在这里插入图片描述

案例一:使用SDL渲染一幅RGB图像数据

#include<iostream>
#include<SDL.h>
#pragma comment(lib,"SDL2.lib")
#undef main()
using namespace std;

int main(int argc, char* argv[])
{
	/*1.创建窗口的大小*/
	int w = 800;
	int h = 600;
	/*初始SDLvideio库,并判断是初始化成功
	返回0视为成功*/

	if (SDL_Init(SDL_INIT_VIDEO))
	{
		cout << SDL_GetError() << endl;
		return -1;
	}

	/*2. 生成SDL窗口
	设置为窗口居中*/
	/*需要判断窗口是否生成*/
	/*SDL_CreateWindow("test_sdl_ffmpeg",
		SDL_WINDOWPOS_CENTERED,
		SDL_WINDOWPOS_CENTERED,
		w, h,
		SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);*/
	auto screen=SDL_CreateWindow("test_sdl_ffmpeg",
		SDL_WINDOWPOS_CENTERED,
		SDL_WINDOWPOS_CENTERED,
		w, h,
		SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
	if (!screen)
	{
		cout << SDL_GetError() << endl;
		return -1;
	}

	//3.生成渲染器
	auto render = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED);
	if (!render)
	{
		cout << SDL_GetError() << endl;
		return -1;
	}

	//4.生成材质
	auto texture = SDL_CreateTexture(render, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, w, h);
	if (!texture)
	{
		cout << SDL_GetError() << endl;
		return -1;
	}

	//存放图像的数据
	//智能指针存放
	// 准备一幅800 * 600的红色RGB图像数据
	shared_ptr<unsigned char> rgb(new unsigned char[w * h * 4]);        // 乘以4是因为像素格式已指定为ARGB888,单个像素点占4字节
	auto r = rgb.get();

	// 为上述图像数据赋值
	for (int j = 0; j < h; j++)
	{
		int lineR = j * w * 4;                                          // 每一行R分量的起始位置
		for (int i = 0; i < w * 4; i += 4)
		{                                                                    //字节序对应上面的SDL_PIXELFORMAT_ARGB8888
			r[lineR + i] = 255;                                                   // B
			r[lineR + i + 1] = 0;                                               // G
			r[lineR + i + 2] = 0;                                             // R
			r[lineR + i + 3] = 0;                                               // A
		}
	}

	//5.将内存数据写入材质
	SDL_UpdateTexture(texture, NULL, r, w * 4);

	//6.清理屏幕
	SDL_RenderClear(render);

	// 设定渲染的目标区域
	SDL_Rect destRect;
	destRect.x = 0;
	destRect.y = 0;
	destRect.w = w;
	destRect.h = h;

	// 7. 复制材质到渲染器对象
	if (SDL_RenderCopy(render, texture, NULL, &destRect))
	{
		cout << SDL_GetError() << endl;
		return -7;
	}
	// 8. 执行渲染操作
	SDL_RenderPresent(render);

	getchar(); //为了运行完不会立马关掉页面
	return 0;

}

案例二:模拟动态修改图像数据

在这里插入图片描述动态修改是想模拟一下多张图片的渲染过程,这里面也就是通过SDL渲染多幅画面(画面是不同的),使画面发生变化。在渲染发生变化时,也就是图片中的过程循环进行,所以我们可以加一个循环,让渲染的这个过程一直进行。
那么新的问题就是,循环需要有一个跳出条件。这里面可以用sdl的事件来进行,增加了一个事件与退出事件的条件,设置一个超时时间。

这里的这个超时时间可以代表的视频中的一个帧率,间隔20ms,一秒是50帧,这里面以后的渲染操作也会占用时间,所以如果按照帧率的要求,这个时间不是直接就能写上去的,还要考虑一下。
#include<iostream>
#include<SDL.h>
#pragma comment(lib,"SDL2.lib")
#undef main()
using namespace std;

int main(int argc, char* argv[])
{
	/*1.创建窗口的大小*/
	int w = 800;
	int h = 600;
	/*初始SDLvideio库,并判断是初始化成功
	返回0视为成功*/

	if (SDL_Init(SDL_INIT_VIDEO))
	{
		cout << SDL_GetError() << endl;
		return -1;
	}

	/*2. 生成SDL窗口
	设置为窗口居中*/
	/*需要判断窗口是否生成*/
	/*SDL_CreateWindow("test_sdl_ffmpeg",
		SDL_WINDOWPOS_CENTERED,
		SDL_WINDOWPOS_CENTERED,
		w, h,
		SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);*/
	auto screen = SDL_CreateWindow("test_sdl_ffmpeg",
		SDL_WINDOWPOS_CENTERED,
		SDL_WINDOWPOS_CENTERED,
		w, h,
		SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
	if (!screen)
	{
		cout << SDL_GetError() << endl;
		return -1;
	}

	//3.生成渲染器
	auto render = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED);
	if (!render)
	{
		cout << SDL_GetError() << endl;
		return -1;
	}

	//4.生成材质
	auto texture = SDL_CreateTexture(render, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, w, h);
	if (!texture)
	{
		cout << SDL_GetError() << endl;
		return -1;
	}

	//存放图像的数据
	//智能指针存放
	// 准备一幅800 * 600的红色RGB图像数据
	shared_ptr<unsigned char> rgb(new unsigned char[w * h * 4]);        // 乘以4是因为像素格式已指定为ARGB888,单个像素点占4字节
	auto r = rgb.get();

	unsigned char tmp = 255;
	for (;;)
{
		SDL_Event ev;
		SDL_WaitEventTimeout(&ev, 30); //时间间隔越长变化越缓慢
		if (ev.type == SDL_QUIT)
		{
			SDL_DestroyWindow(screen);
			break;
		}

		tmp--;
	// 为上述图像数据赋值
	for (int j = 0; j < h; j++)
	{
		int lineR = j * w * 4;                                          // 每一行R分量的起始位置
		for (int i = 0; i < w * 4; i += 4)
		{                                                                    //字节序对应上面的SDL_PIXELFORMAT_ARGB8888
			r[lineR + i] = 0;                                                   // B
			r[lineR + i + 1] = tmp;                                               // G
			r[lineR + i + 2] = 0;                                             // R
			r[lineR + i + 3] = 0;                                               // A
		}
	}

	//5.将内存数据写入材质
	SDL_UpdateTexture(texture, NULL, r, w * 4);

	//6.清理屏幕
	SDL_RenderClear(render);

	// 设定渲染的目标区域
	SDL_Rect destRect;
	destRect.x = 0;
	destRect.y = 0;
	destRect.w = w;
	destRect.h = h;

	// 7. 复制材质到渲染器对象
	if (SDL_RenderCopy(render, texture, NULL, &destRect))
	{
		cout << SDL_GetError() << endl;
		return -7;
	}
	// 8. 执行渲染操作
	SDL_RenderPresent(render);
}
	getchar(); //为了运行完不会立马关掉页面
	return 0;

}

参考:
https://www.cnblogs.com/yongdaimi/p/15554265.html
https://blog.csdn.net/qq21497936/article/details/108602694
https://blog.csdn.net/fan1102958151/article/details/115866458

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-14 23:31:36  更:2022-04-14 23:32:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:52:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码