SDL2常用函数:SDL_RendererSDL_CreateRendererSDL_RenderCopySDL_RenderPresent

news2025/5/31 21:00:43

SDL 渲染器系统详解

SDL_Renderer 概述

SDL_Renderer 是 SDL 2.0 引入的核心渲染抽象,它提供了一种高效的、硬件加速的 2D 渲染方式,比传统的表面(Surface)操作更加高效和灵活。

主要函数

1. SDL_CreateRenderer - 创建渲染器

SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,
                                int index,
                                Uint32 flags);

参数说明

  • window: 关联的窗口
  • index: 渲染驱动索引,通常设为-1让SDL自动选择
  • flags: 渲染器标志,常用组合:
    • SDL_RENDERER_ACCELERATED: 使用硬件加速
    • SDL_RENDERER_PRESENTVSYNC: 垂直同步
    • SDL_RENDERER_TARGETTEXTURE: 支持渲染到纹理

返回值:成功返回渲染器指针,失败返回NULL

示例

SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 
                          SDL_RENDERER_ACCELERATED | 
                          SDL_RENDERER_PRESENTVSYNC);
if(!renderer) {
    printf("创建渲染器失败: %s\n", SDL_GetError());
}

2. SDL_RenderCopy - 纹理复制

int SDL_RenderCopy(SDL_Renderer* renderer,
                  SDL_Texture* texture,
                  const SDL_Rect* srcrect,
                  const SDL_Rect* dstrect);

参数说明

  • renderer: 目标渲染器
  • texture: 要复制的纹理
  • srcrect: 源矩形区域(NULL表示整个纹理)
  • dstrect: 目标矩形区域(NULL表示填充整个渲染目标)

返回值:成功返回0,失败返回负数

示例

// 复制整个纹理到整个窗口
SDL_RenderCopy(renderer, texture, NULL, NULL);

// 复制纹理的一部分到指定位置
SDL_Rect src = {0, 0, 64, 64}; // 纹理左上角64x64区域
SDL_Rect dst = {100, 100, 128, 128}; // 放大到128x128
SDL_RenderCopy(renderer, texture, &src, &dst);

3. SDL_RenderPresent - 呈现渲染结果

void SDL_RenderPresent(SDL_Renderer* renderer);

功能

  • 将渲染缓冲区的内容显示到屏幕
  • 相当于SDL 1.2中的SDL_Flip
  • 如果创建渲染器时指定了SDL_RENDERER_PRESENTVSYNC,则会等待垂直同步

示例

// 渲染循环中
while(running) {
    // 清屏
    SDL_RenderClear(renderer);
    
    // 渲染各种对象...
    SDL_RenderCopy(renderer, texture1, NULL, &rect1);
    SDL_RenderCopy(renderer, texture2, NULL, &rect2);
    
    // 显示到屏幕
    SDL_RenderPresent(renderer);
}

完整工作流程示例

#include <SDL2/SDL.h>

int main(int argc, char* argv[]) {
    SDL_Init(SDL_INIT_VIDEO);
    
    // 创建窗口
    SDL_Window* window = SDL_CreateWindow("Renderer Demo",
                                        SDL_WINDOWPOS_CENTERED,
                                        SDL_WINDOWPOS_CENTERED,
                                        800, 600,
                                        SDL_WINDOW_SHOWN);
    
    // 创建渲染器
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1,
                              SDL_RENDERER_ACCELERATED |
                              SDL_RENDERER_PRESENTVSYNC);
    
    // 加载图像为纹理
    SDL_Surface* surface = SDL_LoadBMP("image.bmp");
    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
    SDL_FreeSurface(surface); // 表面不再需要
    
    // 主循环
    SDL_Event e;
    int running = 1;
    while(running) {
        // 事件处理
        while(SDL_PollEvent(&e)) {
            if(e.type == SDL_QUIT) running = 0;
        }
        
        // 清屏(填充黑色)
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);
        
        // 渲染纹理
        SDL_Rect dst = {100, 100, 200, 200};
        SDL_RenderCopy(renderer, texture, NULL, &dst);
        
        // 绘制一个红色矩形
        SDL_Rect rect = {300, 300, 100, 100};
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
        SDL_RenderFillRect(renderer, &rect);
        
        // 显示到屏幕
        SDL_RenderPresent(renderer);
    }
    
    // 清理资源
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    
    return 0;
}

高级特性

1. 渲染目标(Render Target)

// 创建可渲染的纹理
SDL_Texture* target = SDL_CreateTexture(renderer,
                                      SDL_PIXELFORMAT_RGBA8888,
                                      SDL_TEXTUREACCESS_TARGET,
                                      512, 512);

// 设置渲染目标
SDL_SetRenderTarget(renderer, target);

// 渲染到纹理...
SDL_RenderCopy(renderer, otherTexture, NULL, NULL);

// 重置渲染目标为默认(窗口)
SDL_SetRenderTarget(renderer, NULL);

// 使用渲染好的纹理
SDL_RenderCopy(renderer, target, NULL, &dstRect);

2. 高级混合模式

// 设置混合模式
SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);

// 绘制半透明矩形
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 128); // 50%透明红色
SDL_RenderFillRect(renderer, &rect);

3. 纹理旋转和翻转

// 带旋转和翻转的复制
SDL_RenderCopyEx(renderer, texture, &src, &dst,
                45.0,  // 旋转角度(度)
                NULL,  // 旋转中心(NULL表示中心)
                SDL_FLIP_NONE); // 翻转标志

性能优化建议

  1. 纹理重用:避免频繁创建/销毁纹理
  2. 批处理渲染:合并多个RenderCopy调用
  3. 使用纹理图集:将多个小图像合并到一个大纹理
  4. 适当使用渲染目标:预渲染复杂场景
  5. 限制绘制区域:使用SDL_RenderSetViewport
  6. 选择合适的纹理格式:通常RGBA8888最通用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2391828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust使用Cargo构建项目

文章目录 你好&#xff0c;Cargo&#xff01;验证Cargo安装使用Cargo创建项目新建项目配置文件解析默认代码结构 Cargo工作流常用命令速查表详细使用说明1. 编译项目2. 运行程序3.快速检查4. 发布版本构建 Cargo的设计哲学约定优于配置工程化优势 开发建议1. 新项目初始化​2. …

Python训练营打卡Day39

DAY 39 图像数据与显存 知识点回顾 1.图像数据的格式&#xff1a;灰度和彩色数据 2.模型的定义 3.显存占用的4种地方 a.模型参数梯度参数 b.优化器参数 c.数据批量所占显存 d.神经元输出中间状态 4.batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0c;理解内容…

UE5蓝图中播放背景音乐和使用代码播放声音

UE5蓝图中播放背景音乐 1.创建背景音乐Cube 2.勾选looping 循环播放背景音乐 3.在关卡蓝图中 Event BeginPlay-PlaySound2D Sound选择自己创建的Bgm_Cube 蓝图播放声音方法二&#xff1a; 使用代码播放声音方法一 .h文件中 头文件引用 #include "Kismet/GameplayS…

AI 赋能数据可视化:漏斗图制作的创新攻略

在数据可视化的广阔天地里&#xff0c;漏斗图以其独特的形状和强大的功能&#xff0c;成为展示流程转化、分析数据变化的得力助手。传统绘制漏斗图的方式往往需要耗费大量时间和精力&#xff0c;对使用者的绘图技能和软件操作熟练度要求颇高。但随着技术的蓬勃发展&#xff0c;…

用 Python 模拟下雨效果

用 Python 模拟下雨效果 雨天别有一番浪漫情怀&#xff1a;淅淅沥沥的雨滴、湿润的空气、朦胧的光影……在屏幕上也能感受下雨的美妙。本文将带你用一份简单的 Python 脚本&#xff0c;手把手实现「下雨效果」动画。文章深入浅出&#xff0c;零基础也能快速上手&#xff0c;完…

C#对象集合去重的一种方式

前言 现在AI越来越强大了&#xff0c;有很多问题其实不需要在去各个网站上查了&#xff0c;直接问AI就好了&#xff0c;但是呢&#xff0c;AI给的代码可能能用&#xff0c;也可能需要调整&#xff0c;但是自己肯定是要会的&#xff0c;所以还是总结一下吧。 问题 如果有一个…

在ROS2(humble)+Gazebo+rqt下,实时显示仿真无人机的相机图像

文章目录 前言一、版本检查检查ROS2版本 二、步骤1.下载对应版本的PX4(1)检查PX4版本(2)修改文件名(3)下载正确的PX4版本 2.下载对应版本的Gazebo(1)检查Gazebo版本(2)卸载不正确的Gazebo版本(3)下载正确的Gazebo版本 3.安装bridge包4.启动 总结 前言 在ROS2的环境下&#xff…

github双重认证怎么做

引言 好久没登陆github了&#xff0c; 今天登陆github后&#xff0c;提醒进行2FA认证。 查看了github通知&#xff0c;自 2023 年 3 月起&#xff0c;GitHub 要求所有在 GitHub.com 上贡献代码的用户启用一种或多种形式的双重身份验证 (2FA)。 假如你也遇到这个问题&#xf…

数据的类型——认识你的数据

第02篇&#xff1a;数据的类型——认识你的数据 写在前面&#xff1a;嗨&#xff0c;大家好&#xff01;我是蓝皮怪。在上一篇文章中&#xff0c;我们聊了统计学的基本概念&#xff0c;今天我们来深入了解一个非常重要的话题——数据的类型。你可能会想&#xff1a;"数据就…

第五十二节:增强现实基础-简单 AR 应用实现

引言 增强现实(Augmented Reality, AR)是一种将虚拟信息叠加到真实世界的技术,广泛应用于游戏、教育、工业维护等领域。与传统虚拟现实(VR)不同,AR强调虚实结合,用户无需完全沉浸到虚拟环境中。本文将通过Python和OpenCV库,从零开始实现一个基础的AR应用:在检测到特定…

LLaMaFactory 微调QwenCoder模型

步骤一&#xff1a;准备LLamaFactory环境 首先,让我们尝试使用github的方式克隆仓库: git config --global http.sslVerify false && git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git # 创建新环境&#xff0c;指定 Python 版本&#xff08;以 3.…

【最新版】Arduino IDE的安装入门Demo

1、背景说明 1、本教程编写日期为2025-5-24 2、Arduino IDE的版本为&#xff1a;Arduino IDE 2.3.6 3、使用的Arduino为Arduino Uno 1、ArduinoIDE的安装 1、下载。网址如下&#xff1a;官网 2、然后一路安装即可。 期间会默认安装相关驱动&#xff0c;默认安装即可。 3、安…

不起火,不爆炸,高速摄像机、数字图像相关DIC技术在动力电池新国标安全性能测试中的应用

2026年7月1日&#xff0c;我国将正式实施GB38031-2025《电动汽车用动力蓄电池安全要求》——这项被称为“史上最严电池安全令”的新国标&#xff0c;首次将“热失控不蔓延、不起火、不爆炸”从企业技术储备上升为强制性要求&#xff0c;标志着电池安全进入“零容忍”时代&#…

thinkadmin中使用layui日期选择器,数据库存储时间戳

form.html <div class="layui-form-item label-required-prev" id="jiezhi_time-div">

WSL中ubuntu通过Windows带代理访问github

WSL中ubuntu通过Windows带代理访问github 前言: WSL是Windows下的ubuntu访问工具&#xff0c;目前无法访问外网&#xff0c;因此需要配置一下。 步骤一 代理中进行如下设置: 步骤二 ubuntu22.04中修改配置 使用如下命令获取IP地址&#xff1a; ip route | grep default | aw…

RISC-V特权模式及切换

1 RISC-V特权模式基本概念 1.1 RISC-V特权模式介绍 RISC-V 指令集架构&#xff08;ISA&#xff09;采用多特权级别设计作为其核心安全机制&#xff0c;通过层次化的权限管理实现系统资源的隔离与保护。该架构明确定义了四个层次化的特权模式&#xff0c;按照权限等级由高至低…

【深度学习】11. Transformer解析: Self-Attention、ELMo、Bert、GPT

Transformer 神经网络 Self-Attention 的提出动机 传统的循环神经网络&#xff08;RNN&#xff09;处理序列信息依赖时间步的先后顺序&#xff0c;无法并行&#xff0c;而且在捕捉长距离依赖关系时存在明显困难。为了解决这些问题&#xff0c;Transformer 引入了 Self-Attent…

4060显卡什么水平 4060显卡参数介绍

NVIDIA的GeForce RTX 40系列显卡基于最新的Ada Lovelace架构&#xff0c;提供了前所未有的图形处理能力和效率。其中&#xff0c;RTX 4060定位中高端市场&#xff0c;针对那些寻求卓越性能同时又注重成本效益的用户群体。那么&#xff0c;4060显卡什么水平呢&#xff1f;本文将…

技术为器,服务为本:AI时代的客服价值重构

在智能化浪潮中&#xff0c;大语言模型的出现为客户服务行业注入了全新动能。然而技术创新的价值不在于技术本身&#xff0c;而在于其赋能服务的深度与广度。AI对于我们来说&#xff0c;如同发动机之于汽车&#xff0c;重要的不是引擎参数&#xff0c;而是整车带给用户的驾驶体…

EasyVoice:开源的文本转语音工具,让文字“开口说话“

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、EasyVoice是什么&#xff1f;1. 核心特性一览2. 技术架构概览 二、安装部署指南…