分享

什么是SDL渲染器?

 逸随风清 2022-03-24

SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,适用于 游戏、游戏SDK、演示软件、模拟器、MPEG播放器和其他应用软件。目前支持windows,linux, wince,mac os,非正式地支持symbian os。它被广泛的用于许多著名的游戏。最著名的游戏是赢得LIUNX组游戏开发大奖的 文明:权利的召唤(Civilization: Call To Power)。

·SDL具体应用相关文章

K歌之王   windows mobile用sdl做视频显示 (有相关Windows Mobile下使用的SDL库可以下载)

转:SDL在windows mobile上的使用经验 

在MFC SDI程序中使用SDL

simple direct layer(sdl) 和 symbian  

 ·SDL参考资料

SDL_Renderer,SDL_Window,SDL_Surface和SDL_Texture之间有什么区别,以及它们是如何相关的?先看一段代码:

#include <iostream>#include <SDL2/SDL.h>int main(){
    /* Starting SDL */
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Window */
    SDL_Window *window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if (window == nullptr) {
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Render */
    SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (render == nullptr) {
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Load bitmap image */
    SDL_Surface *bmp = SDL_LoadBMP("./Tutorial/res/Lesson1/hello.bmp");
    if (bmp == nullptr) {
        std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Upload surface to render, and then, free the surface */
    SDL_Texture *texture = SDL_CreateTextureFromSurface(render, bmp);
    SDL_FreeSurface(bmp);
    if (texture == nullptr){
        std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Draw the render on window */
    SDL_RenderClear(render); // Fill render with color
    SDL_RenderCopy(render, texture, NULL, NULL); // Copy the texture into render
    SDL_RenderPresent(render); // Show render on window

    /* Wait 2 seconds */
    SDL_Delay(5000);

    /* Free all objects*/
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);

    /* Quit program */
    SDL_Quit();
    return 0;}

我使用的是Twinklebear教程(在SDL Wiki上提供),并且还查看了SDL Wiki文档和一些书籍。但他们都假设我知道这些定义。

SDL_Window

SDL_Window是保存有关窗口本身的所有信息的结构体:大小,位置,全屏幕,边框等。

SDL_Renderer

SDL_Renderer是一个处理所有渲染的结构.它与a绑定,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_Surface
大致相同.差异主要在于SDL_Surfacestruct包含像素信息,而SDL_Texture对像素数据是有效的,特定于驱动程序的表示.

您可以使用SDL_Surface *转换为SDL_Texture

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

在此之后,SDL_Surface应该被释放

SDL_FreeSurface( SDL_Surface* surface )

另一个重要的区别是SDL_Surface使用软件渲染(通过CPU)同时SDL_Texture使用硬件渲染(通过GPU).

SDL_Rect

SDL中最简单的结构。它只包含四个参数:x,y保持着位置w, h保持宽度和高度。

需要注意的0, 0是SDL中的左上角。所以更高的y值意味着更低,右下角会有坐标x + w, y + h

SDL_Renderer也可能会绑定到表面,而不仅是绑定到窗口,链接:https://wiki./SDL_CreateSoftwareRenderer

考虑SDL_Window为物理像素,以及SDL_Renderer存储设置/上下文的地方。所以创建了一堆资源,并将它们挂在渲染器上; 然后当它准备好时,告诉渲染器将它们放在一起并将结果发送到窗口。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多