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 同时声明了一个我们需要加载的纹理对象
创建渲染器之后,我们需要用 SDL_SetRendererDrawColor 初始化纹理颜色,这控件的颜色用于各种渲染器操作
面加载,像以前一样,这个函数创建一个新的纹理从一个存在的表面上,这就需要我们释放一个 loaded surface,然后返回一个 loaded texture
在清理函数中,我们必须记住释放我们的纹理用 SDL_DestroyTexture
屏幕清除,渲染纹理我们用SDL_RenderCopy 渲染纹理,我们仍然需要更新屏幕,但我们不能用SDL_Surface显示,SDL_UpdateWindowSurface也不能用。相反,我们必须使用SDL_RenderPresent。
程序的完整代码和媒体文件下载地址(这个二维码是我博客的地址,修改图片后缀为 .rar就可以解压,因为我不知道csdn在哪上传文件):右键另存为
//加载个人的纹理图像
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 socket 初步
- 使用C++实现JNI接口需要注意的事项
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器