什么是SDL渲染器?
我从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文档和一些书籍。 但是他们都假设我知道这些定义。
SDL_Window
SDL_Window
是保存有关窗口本身的所有信息的结构:大小,位置,全屏,边框等。
SDL_Renderer
SDL_Renderer
是处理所有渲染的结构。 它绑定到SDL_Window
所以它只能在SDL_Window
呈现。 它也跟踪与渲染相关的设置。 有几个与SDL_Renderer
相关的重要function
-
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_Texture
。 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_Rect
SDL中最简单的结构。 它只包含四个短裤。 保持位置的x, y
和保持宽度和高度的w, h
。
需要注意的是0, 0
是SDL中的左上angular。 因此,较高的y
值意味着较低,而右下angular将具有坐标x + w, y + h
您可以在我的博客上阅读有关SDL2的更多信息。
将SDL_Window
看作物理像素,将SDL_Renderer
和一个存储设置/上下文的地方。
所以你创build了一堆资源,并把它们挂在渲染器上; 然后当它准备好时,告诉渲染器将它们放在一起并将结果发送到窗口。