SDL渲染RGB图像

65 阅读1分钟

创建项目并设置

image.png

image.png

image.png

image.png

项目目录结构如下

image.png

image.png

image.png

image.png

image.png

代码如下

#include <iostream>
#include <sdl/SDL.h>

using namespace std;

// SDL.h头文件中定义了一个main函数的宏,我们要取消掉,否则编译报错
#undef main

// 加入库
#pragma comment(lib, "SDL2.lib")

int main(int argc, char*argv[])
{

	int w = 800;
	int h = 600;

	// 初始化SDL  video库

	if(SDL_Init(SDL_INIT_VIDEO))
	{
		// SDL_Init()初始化为非零表示初始化错误
		cout << SDL_GetError() << endl;
		return -1;
	}

	// 生成SDL窗口

	auto screen = SDL_CreateWindow("test sdl",     // 窗口标题
		SDL_WINDOWPOS_CENTERED,  // 窗口位置
		SDL_WINDOWPOS_CENTERED,
		w, h,                   // 窗口宽高
		SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE // 窗口类型
	);

	if (!screen)
	{
		cout << SDL_GetError() << endl;
		return -2;
	}

	// 生成渲染器
	auto render = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED);

	if (!render)
	{
		cout << SDL_GetError() << endl;
		return -3;
	}

	// 生成材质

	auto texture = SDL_CreateTexture(render, SDL_PIXELFORMAT_ABGR8888,
		SDL_TEXTUREACCESS_STREAMING, // 可加锁
		w, h
	);

	if (!texture)
	{
		cout << SDL_GetError() << endl;
		return -4;
	}


	// 存放图像的数据

	shared_ptr<unsigned char> rgb(new unsigned char[w * h * 4]);
	auto r = rgb.get();
	for (int j = 0; j < h; j++)
	{
		int b = j * w * 4;
		for (int i = 0; i < w * 4; i+=4)
		{
			r[b + i] = 255;  //  R
			r[b + i + 1] = 0; // G
			r[b + i + 2] = 0;  // B
			r[b + i + 3] = 0; // A
		}
	}

	// 将内存数据写入材质

	SDL_UpdateTexture(texture, NULL, r, w * 4);

	// 清理屏幕

	SDL_RenderClear(render);

	SDL_Rect sdl_rect;

	sdl_rect.x = 0;
	sdl_rect.y = 0;
	sdl_rect.w = w;
	sdl_rect.h = h;

	// 复制材质到渲染器

	SDL_RenderCopy(render, texture,
		NULL, // 原图位置和尺寸
		&sdl_rect// 目标位置和尺寸
	);


	// 渲染

	SDL_RenderPresent(render);

	getchar();

	return 0;
}

测试

image.png