2019-10-07 SDL中Texture和Render的区别

2019-10-07  本文已影响0人  Franck2020

最近在研究SDL库的使用,找到了LittleVGL中的一个使用SDL2开源大项目,进行学习。

但是,由于SDL的文档非常少,它对Texture和Render没有进行解释,并且在SDL中的两者的概念和在openGL中的类似但却不完全相同,因此需要好好学习一下。

先上代码:

static void window_create(monitor_t * m)

{

m->window = SDL_CreateWindow("OUI Simulator",

SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,

MONITOR_HOR_RES * MONITOR_ZOOM, MONITOR_VER_RES * MONITOR_ZOOM, 0);      /*last param. SDL_WINDOW_BORDERLESS to hide borders*/

m->renderer = SDL_CreateRenderer(m->window, -1, 0);

m->texture = SDL_CreateTexture(m->renderer,

SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, MONITOR_HOR_RES, MONITOR_VER_RES);

SDL_SetTextureBlendMode(m->texture, SDL_BLENDMODE_BLEND);

memset(m->tft_fb, 0x44, MONITOR_HOR_RES * MONITOR_VER_RES * sizeof(uint32_t));

m->sdl_refr_qry = true;

}

又找到了一些中文解释,如下:

SDL_Renderer

SDL_Renderer是一个处理所有渲染的结构。它绑定到一个,SDL_Window所以它只能在内部渲染SDL_Window。它还会跟踪与渲染相关的设置。有几个重要的功能与之相关SDL_Renderer

SDL_SetRenderDrawColor(renderer, r, g, b, a); 这将您清除屏幕的颜色设置为(见下文)

SDL_RenderClear(renderer); 这将使用上面设置的绘制颜色清除渲染目标

SDL_RenderCopy( 这可能是您最常用的功能,它用于渲染a SDL_Texture并具有以下参数:

SDL_Renderer* renderer, 您要用于渲染的渲染器。

SDL_Texture* texture, 您要渲染的纹理。

const SDL_Rect* srcrect, 要渲染的纹理部分,如果要渲染整个纹理,则为NULL

const SDL_Rect* dstrect) 您想在窗口中渲染纹理的位置。如果它的宽度和高度SDL_Rect比纹理本身的尺寸更小或更大,纹理将根据此延伸SDL_Rect

SDL_RenderPresent(renderer); 其他SDL_Render *函数绘制到隐藏目标。这个函数将采取所有这一切,并将其绘制在与渲染器相关的窗口中。

SDL_Textures和SDL_Surface

的SDL_Renderer,呈现SDL_Texture。SDL_Texture是一个元素的像素信息。这是其中的新版本SDL_Surface非常相似。主要区别在于SDL_Surface它只是一个struct包含像素的信息,而SDL_Texture像素数据是一种高效的驱动程序特定表示。

您可以使用SDL_Surface *转换为SDL_Texture

SDL_Texture*SDL_CreateTextureFromSurface(SDL_Renderer*renderer,SDL_Surface*surface)

综上所述,SDL2中的Render相当于2D图形渲染控件,但是没有渲染所需的具体数据,而Texture则相当于渲染所需的数据集。

这样,相当于把渲染的逻辑,和渲染的数据分离。类似与QT里面的proxy的概念,这样一个table控件,既可以渲染树形的列表,又可以渲染类似excel的table控件。提高了代码的灵活性和复用性。

上一篇下一篇

猜你喜欢

热点阅读