SDL2常用函數&結構分析:SDL_Renderer&SDL_CreateRenderer&SDL_RenderCopy&SDL_RenderPresent

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章