SDL2 C开发中如何将创建的Rectangle转换为Texture
SDL2 C开发:手动创建矩形并转换为纹理实现方案
答案是完全可行,仅依赖SDL2核心API即可完成,无需调用SDL_image等第三方图像库,流程比多数新手预想的简单。
首先需要纠正一个普遍认知偏差:SDL_Rect本身只是存储坐标、宽高四个数值的结构体,不携带任何像素、颜色属性,不存在直接将结构体转换为纹理的操作。我们实际实现的是创建和目标矩形尺寸匹配的纹理,在纹理上绘制对应矩形样式,最终得到可复用的矩形纹理对象,具体实现步骤如下:
- 创建支持渲染写入的空白纹理
调用SDL_CreateTexture接口,纹理访问权限必须设置为SDL_TEXTUREACCESS_TARGET(允许作为渲染目标写入内容),像素格式推荐用和渲染器适配的SDL_PIXELFORMAT_RGBA8888,宽高传入你需要的矩形尺寸即可。
参考代码:// 替换为你自己的渲染器指针、目标矩形宽高 SDL_Texture* rect_tex = SDL_CreateTexture( renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, rect_width, rect_height ); - 切换渲染输出目标到新建纹理
SDL渲染器默认输出到程序窗口,调用SDL_SetRenderTarget将渲染指向新建的纹理,后续绘制操作的结果都会保存在纹理中,不会直接显示到屏幕。SDL_SetRenderTarget(renderer, rect_tex); - 在纹理上绘制矩形内容
先清空纹理的默认残留像素,再设置需要的矩形颜色,调用矩形绘制接口填满整个纹理区域即可:如果需要实心矩形用SDL_RenderFillRect,需要空心边框用SDL_RenderDrawRect。注意此时绘制坐标系是相对于纹理本身的,所以绘制区域坐标从(0,0)开始,尺寸和纹理保持一致。// 清空纹理为全透明,避免出现异常色块 SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); SDL_RenderClear(renderer); // 设置矩形颜色,这里示例为不透明蓝色 SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); SDL_Rect draw_area = {0, 0, rect_width, rect_height}; SDL_RenderFillRect(renderer, &draw_area); - 恢复默认渲染目标
矩形绘制完成后,必须调用SDL_SetRenderTarget把渲染目标切回窗口(传入NULL即可),否则后续所有屏幕绘制操作都会被写入这个纹理,无法正常显示到界面。SDL_SetRenderTarget(renderer, NULL);
完成以上步骤后,得到的rect_tex就是标准的SDL纹理对象,和图片加载接口生成的纹理用法完全一致,可以直接用SDL_RenderCopy贴到屏幕任意位置,支持透明度调整、旋转、缩放等所有纹理操作。
性能提示:如果这个矩形只需要绘制一次、不需要后续复用或做动效,不需要额外转成纹理,直接在窗口渲染目标下调用矩形绘制接口即可,省去纹理创建和切换的开销,性能更高。只有当矩形需要反复绘制、频繁调整属性时,提前生成纹理复用才有收益。
内容的提问来源于stack exchange,提问作者Boy boy
相关产品推荐
相关产品推荐

