题
我从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_窗口
SDL_Window
是保存有关窗口本身的所有信息的结构:大小,位置,全屏,边框等。
SDL_Renderer
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,
要渲染纹理的部分,如果要渲染整个纹理,则为NULLconst SDL_Rect* dstrect)
要在窗口中渲染纹理的位置。如果这个的宽度和高度SDL_Rect
小于或大于纹理本身的尺寸,纹理将根据此进行拉伸SDL_Rect
SDL_RenderPresent(renderer);
其他SDL_Render*函数绘制到隐藏目标。此函数将采用所有这些,并将其绘制在与渲染器绑定的窗口中。
SDL_Textures和SDL_Surface
该 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_Rect
SDL中最简单的结构。它只包含四条短裤。 x, y
其中持有的位置和 w, h
它保持宽度和高度。
重要的是要注意 0, 0
是SDL中的左上角。所以更高 y
-值表示较低,右下角将有坐标 x + w, y + h
你可以在我的 博客。
其他提示
将SDL_Window
视为物理像素,以及生成的位置和存储设置/上下文的位置。
所以你创建了一堆资源,并将它们悬挂在渲染器中;然后当它准备好时,您会告诉渲染器将其全部放在一起并将结果发送到窗口。