您的位置:首页 > 运维架构 > Linux

Lessong 7 纹理加载和渲染

2016-03-18 16:30 633 查看
SDL2.0的一个新添加的主要部分就是纹理渲染API,这可以使你进行快速、灵活的硬件渲染,在本教程中我们将使用这种新的技术

//加载个人的纹理图像
SDL_Texture* loadTexture(string path);

//The Wwindow we'll be rendering to
SDL_Window* gWindow = nullptr;

//The Window renderer
SDL_Renderer* gRenderer = nullptr;

//Current display texture
SDL_Texture* gTexture = nullptr;
纹理在SDL中有自己的数据类型 SDL_Texture,当我们需要处理 SDL纹理并将其渲染到屏幕上,这就是为什么我们声明了一个全局渲染器gRenderer

你也可以看到我们有一个新的图像加载程序 loadTexture 同时声明了一个我们需要加载的纹理对象

//create window
gWindow = SDL_CreateWindow("SDL Tutorial 07", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if(gWindow == nullptr){
printf("Window could not be created! SDL_Error:%s\n", SDL_GetError());
success = false;
}
else{
//create renderer for window
gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED);
if(gRenderer == nullptr){
printf("Renderer could not be created! SDL_Error:%s\n",SDL_GetError());
success = false;
}else{
//Initialize renderer color
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF,0xFF,0xFF);
//Initialize PNG loading
int imgFlags = IMG_INIT_PNG;

if(!(IMG_Init(imgFlags) & imgFlags)){
printf("SDL_image could not initialized! SDL_Error:%s\n",SDL_GetError());
success = false;
}
}
}
}
return success;
当我们创建了我们的窗口后,我们需要为窗口创建一个渲染器渲染纹理,调用 SDL_CreateRenderer 可以很容易的完成

创建渲染器之后,我们需要用 SDL_SetRendererDrawColor 初始化纹理颜色,这控件的颜色用于各种渲染器操作

SDL_Texture* loadTexture(string path){
//The final Texture
SDL_Texture* newTexture = nullptr;

//load image an specified path
SDL_Surface* loadedSurface = IMG_Load(path.c_str());
if(loadedSurface == nullptr){
printf("Unable to load image %s! SDL_image Error:%s\n", path.c_str(), IMG_GetError());
}else{
//Create texture from surface pixel
newTexture = SDL_CreateTextureFromSurface(gRenderer, loadedSurface);
if(newTexture == nullptr){
printf("Unable to create texture from %s! SDL_Error: %s\n", path.c_str(), SDL_GetError());
}
SDL_FreeSurface(loadedSurface);
}
return newTexture;
}
纹理加载函数在很大程度上看起来和以前差不多,只是不使用转换加载表面格式,我们使用SDL_CreateTextureFormSurface创建一个纹理的表

面加载,像以前一样,这个函数创建一个新的纹理从一个存在的表面上,这就需要我们释放一个 loaded surface,然后返回一个 loaded texture

bool loadMedia(){
bool success = true;
gTexture = loadTexture("SDL_7/texture.png");
if(gTexture == nullptr){
printf("Failed to load texture image!\n");
success = false;
}
return success;
}

void close(){
    SDL_DestroyTexture(gTexture);
    gTexture = nullptr;

    SDL_DestroyRenderer(gRenderer);
    SDL_DestroyWindow(gWindow);
    gRenderer = nullptr;
    gWindow = nullptr;

    IMG_Quit();
    SDL_Quit();
}
由于纹理加载是抽象的图像加载函数,loadMedia()函数和之前做的几乎是同一个工作

在清理函数中,我们必须记住释放我们的纹理用 SDL_DestroyTexture

else{
bool quit = false;
SDL_Event e;
while(!quit){
while(SDL_PollEvent(&e) != 0){
if(e.type == SDL_QUIT){
quit = true;
}
}
//clear screen
SDL_RenderClear(gRenderer);
//renderer texture to screen 纹理渲染到屏幕上
SDL_RenderCopy(gRenderer, gTexture, NULL, NULL);
//Update screen
SDL_RenderPresent(gRenderer);
在主循环后,我们调用SDL_Renderer,这个函数用SDL_SetRenderDrawColor最后设置的颜色填充窗口屏幕

屏幕清除,渲染纹理我们用SDL_RenderCopy 渲染纹理,我们仍然需要更新屏幕,但我们不能用SDL_Surface显示,SDL_UpdateWindowSurface也不能用。相反,我们必须使用SDL_RenderPresent。

程序的完整代码和媒体文件下载地址(这个二维码是我博客的地址,修改图片后缀为 .rar就可以解压,因为我不知道csdn在哪上传文件):右键另存为
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux SDL2 c++