SDL2/表面/纹理/渲染

Posted

技术标签:

【中文标题】SDL2/表面/纹理/渲染【英文标题】:SDL2 / Surface / Texture / Render 【发布时间】:2014-01-14 11:46:52 【问题描述】:

我正在尝试学习 SDL2。旧 SDL 和 SDL2 之间的主要区别(如我所见)是旧 SDL 具有由其表面表示的窗口,所有图片都是表面,所有图像操作和 blit 都是表面到表面。在 SDL2 中,我们有表面和纹理。如果我做对了,表面在 RAM 中,而纹理在图形内存中。对吗?

我的目标是为 SDL2 制作面向对象的包装器,因为我对 SDL 也有类似的东西。我想要班级窗口和班级图片(具有私有纹理和表面)。窗口的内容将由图片类的实例表示,并且所有块都是图片到图片对象块。如何组织这些图片操作:

    像素操作应该在表面上吗? 如果我想将一张图片的一部分复制到另一张而不渲染它,它应该在表面上吗? 只有当我想在屏幕上渲染它时,我是否应该只对纹理进行 blit 处理? 是全部渲染到一个表面然后渲染到窗口纹理还是将每张图片单独渲染到窗口纹理更好?

一般来说,什么时候应该使用表面,什么时候应该使用纹理?

感谢您的宝贵时间,欢迎所有帮助和建议 :)

【问题讨论】:

【参考方案1】:

首先我需要澄清一些误解:基于纹理的渲染不像旧的表面渲染那样工作。虽然您可以将SDL_Surfaces 用作源或目标,但SDL_Textures 旨在用作渲染源,而免费的SDL_Renderer 用作目标。通常,您必须在完全在 CPU 上完成的旧渲染框架和用于 GPU 的新渲染框架之间进行选择,但混合是可能的。

所以对于你的问题:

    纹理不提供对像素的直接访问,因此最好在表面上进行。 视情况而定。如果不经常复制纹理并且您想稍后加速渲染,那么复制纹理并没有什么坏处。 在谈到纹理时,您总是会渲染到 SDL_Renderer,并且总是最好在纹理上预加载表面。 正如我在第一段中解释的那样,没有窗口纹理。您可以使用完全基于表面的渲染或完全基于纹理的渲染。如果你真的需要两者(如果你想要直接访问像素和加速渲染),最好按照你说的做:将所有内容blit到一个表面,然后上传到纹理。

最后,您应该尽可能使用纹理。表面使用是一个例外,当您必须使用密集的像素操作或必须处理遗留代码时使用它。

【讨论】:

值得注意的是,您可以使用 SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer, SDL_Surface* surface)SDL_Surface* 轻松创建 SDL_Texture* Textures do not provide direct access to pixels 完全错误!只需创建一个访问类型为SDL_TEXTUREACCESS_STREAMING 的纹理,然后调用SDL_LockTexture(),它会使用有关纹理的信息更新用户提供的&pixels 指针和&pitch 值,从而允许直接,尽管正式“只写”,访问纹理的像素。完成后,解锁,然后正常渲染。

以上是关于SDL2/表面/纹理/渲染的主要内容,如果未能解决你的问题,请参考以下文章

纹理的 SDL 渲染器参数,但表面不需要

表面和纹理之间的区别(SDL/一般)

SDL2 C++ 截图

OpenGL渲染白色纹理错误

手动使用圆柱体中间表面进行纹理映射

SDL2 [优化]:SDL_Surface->texture->copy 比在渲染器上绘图快吗?