问题 SDL2 /表面/纹理/渲染


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

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

  1. 像素操作应该在表面上?
  2. 如果我想将一张图片的一部分复制到另一张而不渲染它,它应该在表面上?
  3. 只有当我想在屏幕上渲染时,我才能将表面blit到纹理?
  4. 是将它全部渲染到一个曲面然后将其渲染到窗口纹理还是将每个图片分别渲染到窗口纹理?

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

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


4905
2017-12-26 21:09


起源



答案:


首先,我需要澄清一些误解:基于纹理的渲染不像旧的表面渲染那样有效。虽然你可以使用 SDL_Surface作为来源或目的地, SDL_Textures旨在用作渲染和赠送的来源 SDL_Renderer 用作目的地。通常,您必须在完全在CPU上完成的旧渲染框架和用于GPU的新渲染框架之间进行选择,但可以进行混合。

所以对你问题:

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

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


12
2018-01-02 17:01



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


答案:


首先,我需要澄清一些误解:基于纹理的渲染不像旧的表面渲染那样有效。虽然你可以使用 SDL_Surface作为来源或目的地, SDL_Textures旨在用作渲染和赠送的来源 SDL_Renderer 用作目的地。通常,您必须在完全在CPU上完成的旧渲染框架和用于GPU的新渲染框架之间进行选择,但可以进行混合。

所以对你问题:

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

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


12
2018-01-02 17:01



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