prc*_*tro 94 c++ sdl terminology sdl-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;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Twinklebear教程(在SDL Wiki上建议),并查看了SDL Wiki文档和一些书籍.但他们都认为我知道这些定义.
ole*_*ard 179
SDL_Window 是包含有关Window本身的所有信息的结构:大小,位置,全屏,边框等.
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_Renderer呈现SDL_Texture,其存储一个元件的像素信息.它的新版本SDL_Surface大致相同.差异主要在于SDL_Surface仅struct包含像素信息,而SDL_Texture对像素数据是有效的,特定于驱动程序的表示.
您可以使用将SDL_Surface*转换为SDL_Texture
SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
SDL_Surface* surface)
Run Code Online (Sandbox Code Playgroud)
在此之后,应该使用释放SDL_Surface
SDL_FreeSurface( SDL_Surface* surface )
Run Code Online (Sandbox Code Playgroud)
另一个重要的区别是SDL_Surface使用软件渲染(通过CPU)同时SDL_Texture使用硬件渲染(通过GPU).
SDL中最简单的结构.它只包含四个短裤.x, y它保持位置并w, h保持宽度和高度.
值得注意的是,这0, 0是SDL的左上角.所以较高的y值意味着较低,而右下角则具有坐标x + w, y + h
可以将其SDL_Window视为物理像素,以及SDL_Renderer存储设置/上下文的位置.
因此,您创建了一堆资源,并将它们从渲染器中挂起; 然后当它准备就绪时,你告诉渲染器将它们放在一起并将结果发送到窗口.