SDL_Renderer
SDL_Renderer
是一個結構體,用來表示SDL2中渲染器的狀態。從代碼的使用上來講,你也可以把它視爲渲染器本身。我們可以利用它產生紋理,也可以用來渲染視圖。通常,SDL_Renderer
實例由SDL_CreateRenderer
函數創建。
SDL_CreateRenderer
函數原型:
SDL_Renderer* SDL_CreateRenderer(SDL_Window* window, int index, Uint32 flags)
功能:爲指定窗口創建渲染器上下文。
參數:
- SDL_Window window*:和渲染器上下文關聯的窗體指針。
- int index:即將初始化的渲染器驅動程序的索引,如果是-1表示flags標誌的第一個可用驅動程序。
- flags:0,或者一個或多個SDL_RendererFlags合併在一起。SDL_RendererFlags見下表
SDL_RendererFlags | 渲染器標誌 |
---|---|
SDL_RENDERER_SOFTWARE | the renderer is a software fallback |
SDL_RENDERER_ACCELERATED | 渲染器使用硬件加速 |
SDL_RENDERER_PRESENTVSYNC | 顯示與刷新率同步 |
SDL_RENDERER_TARGETTEXTURE | 渲染器支持渲染到紋理 |
實測,因爲只是渲染一幀的YUV數據,所以這幾個SDL_RendererFlags換來換去,一個或多個,都沒有什麼明顯區別。可能需要在真正的視頻播放場景下才會出現明顯的差距吧。
返回值:
- SDL_Renderer*:返回一個和參數SDL_Window關聯的渲染器上下文指針。
SDL_RenderCopy
函數原型:
int SDL_RenderCopy(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect)
功能:將制定區域(srcrect)的紋理數據,拷貝到渲染目標尺寸爲(dstrect)的渲染器上下文(renderer)中,爲下一步的渲染做準備。
參數列表:
參數 | 釋義 |
---|---|
renderer | 渲染器的上下文 |
texture | 紋理,紋理的顯示效果如顏色、透明度(alpha值)等會收到其它接口設置最終產生不一樣的效果,這些接口有:SDL_SetTextureColorMod、SDL_SetTextureAlphaMod、SDL_SetTextureBlendMode |
srcrect | 需要拷貝的SDL_Texture尺寸(用SDL_Rect結構表達),NULL則表示整個紋理 |
dstrect | 渲染區域的尺寸(用SDL_Rect結構表達),NULL表示整個渲染整個渲染區域; 如果紋理尺寸不夠,將會拉伸或壓縮紋理。 |
SDL_RenderPresent
函數原型:
void SDL_RenderPresent(SDL_Renderer* renderer)
功能:將渲染器上下文中的數據,渲染到關聯窗體上去。
參數:renderer:渲染器上下文。
SDL的渲染功能在後備緩衝區中運行。也就是說,調用諸如SDL_RenderDrawLine
之類的渲染函數不會直接在屏幕上放置一條線,而是更新後備緩衝區。 因此,您可以構建整個場景並將組合後的緩衝區作爲完整圖片調用SDL_RenderPresent
呈現給屏幕。
因此,在使用SDL的渲染API時,會對幀進行所有繪製,然後每幀調用此函數一次,以向用戶顯示最終繪圖。
數據每次顯示後,後備緩衝應視爲無效。不要假設每幀之間遺留先前的內容。 強烈建議您在開始每個新幀的繪製之前調用SDL_RenderClear來初始化後備緩衝區,即使您打算覆蓋每個像素也是如此。
示例代碼
#include "SDL.h"
int main(int argc, char *argv[]) {
SDL_Window *win = NULL;
SDL_Renderer *renderer = NULL;
SDL_Texture *bitmapTex = NULL;
SDL_Surface *bitmapSurface = NULL;
int posX = 100, posY = 100, width = 320, height = 240;
SDL_Init(SDL_INIT_VIDEO);
win = SDL_CreateWindow("Hello World", posX, posY, width, height, 0);
renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
bitmapSurface = SDL_LoadBMP("hello.bmp");
bitmapTex = SDL_CreateTextureFromSurface(renderer, bitmapSurface);
SDL_FreeSurface(bitmapSurface);
while (1) {
SDL_Event e;
if (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
break;
}
}
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, bitmapTex, NULL, NULL);
SDL_RenderPresent(renderer);
}
SDL_DestroyTexture(bitmapTex);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}