SDL2.0纹理与渲染


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

SDL2.0纹理与渲染

初始化: 

SDL_Init(): 初始化SDL。 

SDL_CreateWindow(): 创建窗口(Window)。 

SDL_CreateRenderer(): 基于窗口创建渲染器(Render)。 

SDL_CreateTexture(): 创建纹理(Texture)。 


循环渲染数据: 

SDL_UpdateTexture(): 设置纹理的数据。 

SDL_RenderCopy(): 纹理复制给渲染器。 

SDL_RenderPresent(): 显示。


使用SDL_Texture将视频纹理渲染出来。


SDL 视频渲染相关对象

SDL 视频渲染主要涉及到四个对象:

SDL_Window、SDL_Render、SDL_Texture和SDL_Surface。


SDL_Window代表的是窗口的逻辑概念,它是存放在主内存中的一个对象。当我们调用SDL API 创建窗口后,它并不会被显示出来。


SDL_Render 是渲染器,它也是主存中的一个对象。对Render操作时实际上分为两个阶段:


渲染阶段。在该阶段,用户可以画各种图形渲染到SDL_Surface或SDL_Texture 中;

显示阶段。参SDL_Texture为数据,通过OpenGL操作GPU,最终将 SDL_Surfce 或SDL_Texture中的数据输出到显示器上。

SDL_Render对象中有一个视频缓冲区,该缓冲区我们称之为SDL_Surface,它是按照像素存放图像的。我们一般把真彩色的像素称为RGB24数据。也就是说,每一个像素由24位组成,每8位代表一种颜色,像素的最终颜色是由RGB三种颜色混合而成的。


SDL_Texture 与SDL_Surface 相似,也是一种缓冲区。只不过它存放的不是真正的像素数据,而是存放的图像的描述信息。这些描述信息通过OpenGL、D3D 或 Metal等技术操作GPU,从而绘制出与SDL_Surface一样的图形,且效率更高。

SDL_Surface: 软渲染(CPU)

SDL_Texture: 硬渲染(GPU)


使用 SDL_Texute 渲染纹理的步骤

SDL提供了操作SDL_Texture的方法,使用SDL_Texute的基本步骤为:

创建一个 SDL_Texture。

渲染 Texture

Destory Texture


使用SDL渲染纹理的核心API

a). 创建 SDL_Texture

SDL_Texture* SDL_CreateTexture(SDL_Renderer* renderer,  // 渲染器

                       Uint32        format,  // 渲染数据的格式,如YUV、RGB     

                       int           access,   // Texture 类型,target、stream 

                       int           w,                

                       int           h)

下面说明一下重要参数:

format: 指明像素格式,可以是YUV,也可以是RGB

access: 指明Texture的类型。可以是 Stream(视频),也可以是Target一般的类型。


b). 渲染

int SDL_RenderCopy(SDL_Renderer* renderer,

               SDL_Texture*    texture,

               const SDL_Rect* srcrect,

               const SDL_Rect* dstrect)

 


下面说明一下重要参数:

srcrect: 指定 Texture 中要渲染的一部分。如果将 Texture全部输出,可以设置它为 NULL。

dstrect: 指定输出的空间大小。


c). 销毁 SDL_Texture

void SDL_DestroyTexture(SDL_Texture* texture)


/////main_Render_Texture_demo
int main_Render_Texture_demo()
{
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *texture;
SDL_Event event;
SDL_Rect r;
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s", SDL_GetError());
return 3;
}
window = SDL_CreateWindow("SDL_CreateTexture",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
1024, 768,
SDL_WINDOW_RESIZABLE);
r.w = 100;
r.h = 50;
renderer = SDL_CreateRenderer(window, -1, 0);
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 1024, 768);
// 跳来跳去的方块
while (1) {
SDL_PollEvent(&event);
if (event.type == SDL_QUIT)
break;
r.x = rand() % 500;
r.y = rand() % 500;
SDL_SetRenderTarget(renderer, texture);
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
SDL_RenderClear(renderer);
SDL_RenderDrawRect(renderer, &r);
SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0x00);
SDL_RenderFillRect(renderer, &r);
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
}
SDL_DestroyRenderer(renderer);
SDL_Quit();
return 0;
}


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***