SDL2常用函数:SDL_Texture 数据结构及使用介绍

SDL_Texture 介绍

SDL_Texture 是 SDL 2.0 引入的核心图形数据结构,用于高效硬件加速渲染。相比 SDL_Surface,它直接在 GPU 显存中存储纹理数据,提供更快的渲染性能。

SDL_Texture 特性

  1. 硬件加速:利用 GPU 进行渲染,性能显著高于软件渲染
  2. 不直接访问像素:无法像 Surface 那样直接操作像素数据
  3. 与渲染器绑定:必须通过 SDL_Renderer 创建和使用
  4. 支持高级特性:包括混合模式、颜色调制、Alpha 混合等

创建与销毁 Texture

创建方法

c 复制代码
// 从 Surface 创建 Texture
SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer, SDL_Surface* surface);

// 直接创建空 Texture
SDL_Texture* SDL_CreateTexture(SDL_Renderer* renderer,
                              Uint32 format,         // 像素格式 (SDL_PIXELFORMAT_*)
                              int access,            // 访问模式 (SDL_TEXTUREACCESS_*)
                              int w, int h);         // 宽度和高度

访问模式 (access)

  • SDL_TEXTUREACCESS_STATIC:不常修改的内容
  • SDL_TEXTUREACCESS_STREAMING:频繁更新的内容
  • SDL_TEXTUREACCESS_TARGET:可作为渲染目标

销毁 Texture

c 复制代码
void SDL_DestroyTexture(SDL_Texture* texture);

常用操作函数

更新纹理数据

c 复制代码
// 更新整个纹理
int SDL_UpdateTexture(SDL_Texture* texture,
                     const SDL_Rect* rect,  // NULL 表示整个纹理
                     const void* pixels,    // 像素数据
                     int pitch);            // 每行字节数

// 锁定纹理以直接访问 (谨慎使用)
int SDL_LockTexture(SDL_Texture* texture,
                   const SDL_Rect* rect,
                   void** pixels,
                   int* pitch);

void SDL_UnlockTexture(SDL_Texture* texture);

渲染属性设置

c 复制代码
// 设置混合模式
int SDL_SetTextureBlendMode(SDL_Texture* texture, SDL_BlendMode blendMode);

// 设置颜色调制 (RGBA)
int SDL_SetTextureColorMod(SDL_Texture* texture,
                          Uint8 r, Uint8 g, Uint8 b);

// 设置Alpha透明度
int SDL_SetTextureAlphaMod(SDL_Texture* texture, Uint8 alpha);

渲染 Texture

c 复制代码
// 复制纹理到渲染目标
int SDL_RenderCopy(SDL_Renderer* renderer,
                  SDL_Texture* texture,
                  const SDL_Rect* srcrect,  // 源矩形 (NULL表示整个纹理)
                  const SDL_Rect* dstrect); // 目标矩形

// 带旋转和翻转的复制
int SDL_RenderCopyEx(SDL_Renderer* renderer,
                    SDL_Texture* texture,
                    const SDL_Rect* srcrect,
                    const SDL_Rect* dstrect,
                    const double angle,     // 旋转角度(度)
                    const SDL_Point* center, // 旋转中心点
                    const SDL_RendererFlip flip); // 翻转标志

使用示例

基本使用流程

c 复制代码
#include <SDL2/SDL.h>

int main() {
    SDL_Init(SDL_INIT_VIDEO);
    
    // 创建窗口和渲染器
    SDL_Window* window = SDL_CreateWindow("Texture Demo", 
                                         SDL_WINDOWPOS_CENTERED, 
                                         SDL_WINDOWPOS_CENTERED,
                                         800, 600, 
                                         SDL_WINDOW_SHOWN);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 
                                              SDL_RENDERER_ACCELERATED);
    
    // 加载图像到Surface然后转为Texture
    SDL_Surface* surface = SDL_LoadBMP("image.bmp");
    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
    SDL_FreeSurface(surface);  // 不再需要Surface
    
    // 主循环
    SDL_Event event;
    int quit = 0;
    while (!quit) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                quit = 1;
            }
        }
        
        // 清屏
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);
        
        // 渲染纹理
        SDL_Rect dstrect = {100, 100, 200, 200};
        SDL_RenderCopy(renderer, texture, NULL, &dstrect);
        
        // 更新屏幕
        SDL_RenderPresent(renderer);
    }
    
    // 清理资源
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    
    return 0;
}

动态更新纹理示例

c 复制代码
// 创建可流式访问的纹理
SDL_Texture* dynamicTex = SDL_CreateTexture(renderer,
                                           SDL_PIXELFORMAT_RGBA8888,
                                           SDL_TEXTUREACCESS_STREAMING,
                                           256, 256);

// 在主循环中更新纹理
void* pixels;
int pitch;
SDL_LockTexture(dynamicTex, NULL, &pixels, &pitch);

// 直接操作像素数据
Uint32* upixels = (Uint32*)pixels;
for (int y = 0; y < 256; y++) {
    for (int x = 0; x < 256; x++) {
        upixels[y * (pitch / 4) + x] = SDL_MapRGBA(format, x, y, (x + y) % 256, 255);
    }
}

SDL_UnlockTexture(dynamicTex);

最佳实践

  1. 尽量减少纹理切换:批量渲染相同纹理的对象
  2. 合理选择访问模式 :
    • 静态内容用 SDL_TEXTUREACCESS_STATIC
    • 频繁更新的用 SDL_TEXTUREACCESS_STREAMING
  3. 适当使用纹理图集:将多个小图像合并到一个大纹理中
  4. 注意资源管理:及时销毁不再使用的纹理
  5. 优先使用SDL_RenderCopyEx:它比多个单独变换操作更高效

SDL_Texture 是 SDL 2.x 中高效渲染的关键,特别适合游戏开发和需要高性能图形处理的应用程序。

相关推荐
DolitD2 天前
水利数字孪生走向深水区,点量云流实时云渲染落地实践
安全·云原生·云计算·图形渲染
遇码3 天前
macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件
rust·图形渲染·策略模式·桌面应用·gpui
Cx330❀5 天前
Qt 界面美化指南:从零掌握 QSS 核心机制与工程实践
开发语言·qt·ui·性能优化·图形渲染
the3clipse8 天前
VVC硬件解码器设计:RTL架构、流水线优化与FPGA验证实战
vvc·h.266·硬件加速·视频解码·硬件解码·rtl设计·fpga验证
ggb喔8 天前
52pojie 的图片工具:为什么无损转换后体积涨了 6 倍、照片方向还是歪的
图像处理·python·算法·计算机视觉·图形渲染·媒体
anxiao_m9 天前
水利数字孪生怎么选?主流可视化渲染平台深度横向测评
大数据·前端·人工智能·图形渲染·云渲染
Cx330❀10 天前
Qt 多线程深度解析:从底层原理到 UI 线程与同步实战
开发语言·qt·ui·搜索引擎·性能优化·图形渲染
Helix25014 天前
Chrome 性能优化实战:内存节省、硬件加速与 Flags 设置,让浏览器更流畅
chrome·google·性能优化·内存占用·硬件加速·设置技巧·浏览器优化
Cx330❀15 天前
【Qt 进阶指南】详解 Qt 常用标准对话框与主窗口组件架构
开发语言·qt·ui·性能优化·架构·图形渲染
the3clipse19 天前
视频编码技术如何赋能游戏性能优化:从硬件隔离到AI驱动的带宽革命
游戏·性能优化·音视频·视频编码·硬件加速·ai编码·自适应编码