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;
}
相关文章
|
28天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
4天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
442 17
|
7天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
20天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
7天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
380 2
|
22天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
24天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2600 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
289 2
|
4天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
106 65
|
24天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1582 17
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码