我已经成功地创建和绘制了一个位图图像,并使用渲染器绘制了一条绿线到我的SDL窗口。问题是,我不知道如何同时在同一个窗口做这两件事。
void draw::image(){
SDL_Surface *bmp = SDL_LoadBMP("C:\\Users\\Joe\\Documents\\Visual Studio 2013\\Projects\\SDL_APP1\\map1.bmp");
SDL_BlitSurface(bmp, 0, SDL_GetWindowSurface(_window), 0);
SDL_Renderer * renderer = SDL_CreateRenderer(_window, -1, 0);
// draw green line across screen
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
SDL_RenderDrawLine(renderer, 0, 0, 640, 320);
SDL_RenderPresent(renderer);
SDL_UpdateWindowSurface(_window);
SDL_Delay(20000);
// free resources
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(_window);
}这个版本的代码将bmp文件绘制到窗口,因为SDL_UpdateWindowSurface();是在SDL_RenderPresent()之后;但是,当我翻转这些文件时,它会在屏幕上画一条绿线。我该如何在我的BMP上画绿线呢?
发布于 2015-10-29 04:28:51
不能同时使用这两种方法,必须选择一种或另一种。我建议你和SDL_Renderer一起去。从您的SDL_Texture中创建一个SDL_Surface并使用SDL_RenderCopy呈现它。
发布于 2015-10-29 10:37:49
如果您将映像存储在RAM中,并使用CPU进行渲染(这称为软件呈现),则使用SDL_UpdateWindowSurface。
通过调用此函数,您可以告诉CPU更新屏幕并使用软件呈现绘制。
您可以使用SDL_Surface将纹理存储在内存中,但是软件呈现是无效的。您可以使用SDL_BlitSurface进行抽签调用。
SDL_UpdateWindowSurface相当于SDL1.2API SDL_Flip()。
另一方面,当您使用GPU渲染纹理并将纹理存储在GPU上(这称为硬件加速渲染)时,您应该使用SDL_RenderPresent。
这个函数告诉GPU向屏幕呈现。
使用SDL_Texture将纹理存储在GPU上。使用此命令时,可以通过使用SDL_RenderCopy或如果需要转换SDL_RenderCopyEx进行绘制调用。
因此,在使用SDL的呈现API时,可以执行针对框架的所有绘图,然后每帧调用该函数一次,以便将最终的绘图呈现给用户。
你应该使用硬件渲染--它比软件渲染要高效得多!即使运行该程序的用户没有GPU (这是罕见的,因为大多数CPU有一个集成的GPU) SDL将切换到软件渲染由它自己!
顺便说一下,您可以将图像加载为SDL_Texture,而无需将图像作为SDL_Surface加载并使用图像库将其转换为SDL_Texture,这是因为它支持几种图像格式,而不仅仅是BMP,比如纯图像。(SDL_image由SDL的创建者制作)
只需使用IMG_LoadTexture从SDL_image!
https://stackoverflow.com/questions/33402909
复制相似问题