You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDL中如何将纹理复制到另一纹理且不指向同一内存地址?

复制SDL纹理的解决方案

要实现独立的纹理复制,你需要创建一个全新的纹理对象,然后将源纹理的内容渲染到新纹理中,具体步骤如下:

  1. 获取源纹理的参数
    先用SDL_QueryTexture获取源纹理的像素格式、尺寸等信息,确保新纹理和源纹理保持一致:

    int format, access, width, height;
    SDL_QueryTexture(screen, &format, &access, &width, &height);
    
  2. 创建新的目标纹理
    使用获取到的参数创建名为temp的新纹理,建议将访问模式设为SDL_TEXTUREACCESS_TARGET,方便后续修改:

    SDL_Texture *temp = SDL_CreateTexture(renderer, format, SDL_TEXTUREACCESS_TARGET, width, height);
    if (!temp) {
        // 处理创建失败的情况,比如打印SDL_GetError()
        return;
    }
    
  3. 将源纹理内容复制到新纹理
    通过设置渲染目标为新纹理,再调用SDL_RenderCopy完成内容复制,最后恢复原渲染目标:

    // 保存当前渲染目标
    SDL_Texture *original_target = SDL_GetRenderTarget(renderer);
    
    // 切换渲染目标到temp
    SDL_SetRenderTarget(renderer, temp);
    // 可选:清除新纹理的背景(如果需要透明背景的话)
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
    SDL_RenderClear(renderer);
    // 复制源纹理到temp(NULL表示复制整个纹理)
    SDL_RenderCopy(renderer, screen, NULL, NULL);
    
    // 恢复原渲染目标(通常是窗口的默认帧缓冲)
    SDL_SetRenderTarget(renderer, original_target);
    

这样操作后,temp就是完全独立于screen的纹理,修改temp不会对screen产生任何影响。

注意事项:

  • 该方法要求SDL版本在2.0及以上,且渲染器支持渲染目标(大部分主流渲染后端如OpenGL、Direct3D都支持)。
  • 记得在不需要纹理时调用SDL_DestroyTexture释放内存,避免泄漏。

内容的提问来源于stack exchange,提问作者Sachin Vijaykumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:37:14