SDL基础使用02(加载bmp图片、纹理和渲染)

简介: 这篇文章介绍了如何使用SDL库在C++中加载和显示BMP图片,以及如何使用纹理和渲染器进行更高级的图形处理。

1. 加载bmp图片到SDL窗口

步骤 SDL 函数
1.初始化SDL SDL_Init
2.创建窗口 SDL_CreateWindow
3.获取窗口表面 SDL_GetWindowSurface
4.加载bmp图片到surface SDL_LoadBMP
5.将图片surface设置到窗口surface上 SDL_BlitSurface
6.更新窗口surface显示 SDL_UpdateWindowSurface
7.释放资源,退出SDL SDL_FreeSurface, SDL_DestroyWindow, SDL_Quit
#include <iostream>
/* 加载bmp图片
*    1. SDL默认只能加载bmp图片
*/
extern "C"
{
#include <SDL.h>
}

#pragma comment(lib, "SDL2.lib")


#undef main
int main03()
{
    // 1. 初始化SDL
    int nRet = SDL_Init(SDL_INIT_EVERYTHING);
    if (nRet < 0)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 2. 创建窗口
    SDL_Window* pWnd = SDL_CreateWindow("BMP SHOW",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        640, 480,
        SDL_WINDOW_SHOWN);
    if (NULL == pWnd)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 3. 获取窗口表面 
    SDL_Surface* pWndSurface = SDL_GetWindowSurface(pWnd);
    if (NULL == pWndSurface)
    {
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 4. 加载bmp图片
    SDL_Surface* pBmpSurface = SDL_LoadBMP("./Panda.bmp");

    // 5. 将图片的surface设置到窗口的surface上
    SDL_BlitSurface(pBmpSurface, NULL, pWndSurface, NULL);

    // 6. 更新窗口surface显示
    SDL_UpdateWindowSurface(pWnd);

    SDL_Delay(3000);

    // 7. 释放资源
    if (pBmpSurface)
    {
        SDL_FreeSurface(pBmpSurface);
    }
    if (pWnd)
    {
        SDL_DestroyWindow(pWnd);
    }

    // 8. 退出SDL
    SDL_Quit();

    return 0;
}

2. 纹理和渲染的简单使用

1. 初始化SDL                SDL\_Init  
2. 创建窗口                SDL\_CreateWindow  
3. 基于窗口创建渲染器    SDL\_CreateRenderer  
4. 基于渲染器创建纹理    SDL\_CreateTexture  
5. 绘制三部曲  
    5.1 清空渲染器上一次的显示        SDL\_RenderClear  
    /// 一些绘制操作     SDL\_SetRenderDrawColor SDL\_RenderFillRect  SDL\_RenderDrawRect   
    5.2 拷贝纹理数据到渲染器            SDL\_RenderCopy  
    5.3 更新渲染器显示                SDL\_RenderPresent  
6. 释放资源,退出        SDL\_DestroyTexture  SDL\_DestroyRenderer SDL\_DestroyWindow                SDL\_Quit
#include <iostream>
/* 纹理和渲染(方块跳动) */
extern "C"
{
#include <SDL.h>
}

#pragma comment(lib, "SDL2.lib")

#undef main
int main()
{
    // 1. 初始化
    int nRet = SDL_Init(SDL_INIT_EVERYTHING);
    if (nRet < 0)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 2. 创建窗口
    SDL_Window* pWnd = SDL_CreateWindow("Title",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        640, 480,
        SDL_WINDOW_SHOWN);
    if (NULL == pWnd)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 3. 创建渲染器
    SDL_Renderer* pRenderer = SDL_CreateRenderer(pWnd, -1, 0);
    if (NULL == pRenderer)
    {
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 4. 创建纹理
    SDL_Texture*  pTexture = SDL_CreateTexture(pRenderer,                        // 渲染器
                                               SDL_PIXELFORMAT_RGBA8888,        // 渲染数据格式(YUV RGB)
                                               SDL_TEXTUREACCESS_TARGET,        // 纹理类型 static、stream、target
                                               640, 480);                        // 纹理宽高
    if (NULL == pTexture)
    {
        SDL_DestroyRenderer(pRenderer);
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    SDL_Event event;
    SDL_Rect  rect;
    rect.w = 50, rect.h = 50;
    while (true)
    {
        SDL_PollEvent(&event);            // 获取事件
        if (event.type == SDL_QUIT)
            break;
        rect.x = rand() % 640;            // 随机方块的位置
        rect.y = rand() % 480;

        SDL_SetRenderTarget(pRenderer, pTexture);                    // 设置渲染器目标(此时绘制目标为整个纹理)
        SDL_SetRenderDrawColor(pRenderer, 0xFF, 0x00, 0x00, 0x00);    // 设置渲染器绘制颜色(背景颜色)(不设置,下一次循环渲染器绘制颜色为下面设置的颜色)
        SDL_RenderClear(pRenderer);                                    // 刷新渲染器(将渲染器上次渲染清空)

        SDL_SetRenderDrawColor(pRenderer, 0x00, 0xFF, 0x00, 0x00);    // 设置渲染器绘制颜色
        SDL_RenderDrawRect(pRenderer, &rect);                        // 绘制矩形
        SDL_RenderFillRect(pRenderer, &rect);                        // 绘制填充矩形

        // 渲染三部曲:1. 清空上一次的显示    2. 拷贝纹理数据到渲染器        3. 更新渲染器显示 
        SDL_SetRenderTarget(pRenderer, NULL);                        // 清除一下渲染器的目标
        SDL_RenderCopy(pRenderer, pTexture, NULL, NULL);            // 拷贝纹理绘制信息到渲染器
        SDL_RenderPresent(pRenderer);                                // 更新渲染器
        SDL_Delay(500);
    }

    // 释放纹理
    if (pTexture)
    {
        SDL_DestroyTexture(pTexture);
    }
    // 释放渲染
    if (pRenderer)
    {
        SDL_DestroyRenderer(pRenderer);
    }
    // 释放窗口
    if (pWnd)
    {
        SDL_DestroyWindow(pWnd);
    }

    SDL_Quit();

    return 0;
}
相关文章
[笔记]音视频学习之SDL篇《五》裁剪图片成子图片(裁剪精灵表)
[笔记]音视频学习之SDL篇《五》裁剪图片成子图片(裁剪精灵表)
|
前端开发
Threejs - 加载视频纹理渲染 实现一个3D视频播放器
Threejs - 加载视频纹理渲染 实现一个3D视频播放器
2078 0
Threejs - 加载视频纹理渲染 实现一个3D视频播放器
|
3天前
|
C++
SDL基础使用03(渲染显示bmp图片)
如何使用SDL库在C++中创建窗口、加载BMP图片、创建纹理,并通过渲染器进行显示的完整过程。
13 2
|
图形学
unity3d置灰image图片shader
新建材质球,赋值该shader,将材质球复制到image上即可置灰image Shader "UIEffect/ImageGray" { Properties { [PerRendererData] _MainTex("...
1536 0
|
2月前
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
31 2
|
人工智能
将 JPEG 和 PNG 位图转换为 SVG 矢量图,可无限放大
将 JPEG 和 PNG 位图转换为 SVG 矢量图,可无限放大
290 0
VC中GDI+双缓冲实现Picture控件中显示png图片
VC中GDI+双缓冲实现Picture控件中显示png图片
221 0
|
开发工具 Windows
SDL开发笔记(三):使用SDL渲染窗口颜色和图片
SDL开发笔记(三):使用SDL渲染窗口颜色和图片
SDL开发笔记(三):使用SDL渲染窗口颜色和图片
|
算法 图形学
【Unity3D Shader】学习笔记-图片滤镜①
效果和上面的比较相似,Photoshop CS图像黑白调整功能的计算公式为: gray= (max - mid) * ratio_max + (mid - min) * ratio_max_mid + min 公式中:gray为像素灰度值,max、mid和min分别为图像像素R、G、B分量颜色的最大值、中间值和最小值,ratio_max为max所代表的分量颜色(单色)比率,ratio_max_mid则为max与mid两种分量颜色所形成的复色比率。 默认的单色及复色比率为:
912 0
【Unity3D Shader】学习笔记-图片滤镜①
从本地加载纹理【基于SOIL库】
从本地加载纹理【基于SOIL库】
193 0
从本地加载纹理【基于SOIL库】