c++ sdl_rendercopy - 什么是SDL渲染器?




sdl_updatetexture (3)

我从SDL2开始,并试图了解什么是SDL_Renderer时遇到了一些麻烦。

它是什么? 它有什么作用? 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文档和一些书籍。 但他们都假设我知道这些定义。


Answers

SDL_Window看作物理像素,将SDL_Renderer和存储设置/上下文的地方考虑SDL_Window

所以你创建了一堆资源,并将它们挂在渲染器上; 然后当它准备好时,您告诉渲染器将它们放在一起并将结果发送到窗口。


SDL_Window

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

SDL_Renderer

SDL_Renderer是处理所有渲染的结构。 它绑定到SDL_Window因此它只能在SDL_WindowSDL_Window 。 它还会跟踪与渲染相关的设置。 有几个与SDL_Renderer相关的重要功能

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

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

  • SDL_RenderCopy(
    这可能是您将使用最多的函数,它用于呈现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_TextureSDL_Texture是一个元素的像素信息。 这是SDL_Surface的新版本,它与此基本相同。 其主要区别在于, SDL_Surface只是一个包含像素信息的struct ,而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

您可以在我的blog.上阅读有关SDL2的更多信息blog.


我使用引用,除非我需要以下任何一个:

  • 空指针可以用作标记值,通常是避免函数重载或使用bool的廉价方法。

  • 你可以对指针进行算术运算。例如,p += offset;





c++ sdl sdl-2