什么是 SDL 渲染器?

问题描述 投票:0回答:2

我从 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 文档和一些书籍。但他们都假设我知道这些定义。

c++ sdl terminology sdl-2
2个回答
254
投票

SDL_窗口

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


SDL_渲染器

SDL_Renderer
是一个处理所有渲染的结构体。它与
SDL_Window
相关联,因此只能在该
SDL_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_纹理和SDL_表面

SDL_Renderer
渲染
SDL_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_矩形

SDL 中最简单的结构体。它仅包含四条短裤。

x, y
保存位置,
w, h
保存宽度和高度。

需要注意的是,

0, 0
是 SDL 中的左上角。因此,较高的
y
值意味着较低,右下角的坐标为
x + w, y + h


您可以在我的博客上阅读有关 SDL2 的更多信息。


11
投票

SDL_Window
视为物理像素,并将
SDL_Renderer
视为存储设置/上下文的位置。

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

© www.soinside.com 2019 - 2024. All rights reserved.