SDL_Window 代表了一个 "窗口"
SDL_Renderer 代表了一个 "渲染器"
SDL_Texture 代表了一个“纹理"
SDL_Rect 一个简单的矩形结构
存储RGB和存储纹理的区别:
比如一个从左到右由红色渐变到蓝色的矩形,用存储RGB的话就需要把矩形中每个点的具体颜色值存储下来;
而纹理只是一些描述信息,比如记录了矩形的大小、起始颜色、终止颜色等信息显卡可以通过这些信息推算出矩形块的详细信息。
所以相对于存储RGB而已,存储纹理占用的内存要少的多。
SDL_init():初始化SDL系统
SDL_CreateWindow():创建窗口SDL_Window
SDL_CreateRenderer():创建渲染器 SDL_Renderer
SDL_CreateTexture():创建纹理 SDL_Texture
SDL_UpdateTexture():设置纹理的数据
SDL_RenderCopy():将纹理的数据拷贝给渲染器
SDL_RenderPresent():显示
SDL_Delay():工具函数,用于延时
SDL_Quit():退出SDL系统
1、一个窗口可以有多个render
2、render 用来渲染纹理
3、render 用来显示纹理
下面是一个关于 SDL 渲染的demo
#define TRUE 1
int video_display()
{
int run = TRUE;
SDL_Window *window = NULL;
SDL_Renderer *renderer = NULL;
SDL_Texture *texture = NULL;
SDL_Rect rect;
rect.w = 50;
rect.h = 50;
// 初始化函数,可以确定希望激活的子系统
SDL_Init(SDL_INIT_VIDEO);
// 创建窗口SDL_Window
window = SDL_CreateWindow("video_display Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
if (!window)
{
printf("Can't create -- window -- ,err:%s\n", SDL_GetError());
return -1;
}
// 创建渲染器 SDL_Renderer
renderer = SDL_CreateRenderer(window, -1, 0); // 基于窗口创建渲染器
if (!renderer)
{
printf("Can't create -- renderer -- ,err:%s\n", SDL_GetError());
return -1;
}
// 创建纹理 SDL_Texture
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 640, 480);
if (!texture)
{
return -1;
}
int show_count = 0; // 显示次数
while (run)
{
rect.x = rand() % 600;
rect.y = rand() % 400;
SDL_SetRenderTarget(renderer, texture); // 设置渲染目标为纹理
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 纹理背景为黑色
SDL_RenderClear(renderer); // 清屏
SDL_RenderDrawRect(renderer, &rect); // 绘制一个长方形
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); // 长方形为白色
SDL_RenderFillRect(renderer, &rect);
SDL_SetRenderTarget(renderer, NULL); // 恢复默认,渲染目标为窗口
SDL_RenderCopy(renderer, texture, NULL, NULL); // 拷贝纹理到CPU
SDL_RenderPresent(renderer); // 输出到目标窗口上
SDL_Delay(1000);
if (show_count++ > 30)
{
run = 0; // 不跑了
}
}
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit(); // 释放资源
return 0;
}
运行结果如下