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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值