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

Posted

技术标签:

【中文标题】表面和纹理之间的区别(SDL/一般)【英文标题】:Difference between surface and texture (SDL / general) 【发布时间】:2014-02-18 23:50:58 【问题描述】:

谁能用简单的话向我解释一下纹理和表面之间的区别?我看到它在SDL2 中用作SDL_SurfaceSDL_TextureSDL_Texture 是从 SDL_Surface 创建的,而 SDL_Surface 又是从图像/位图创建的。两者都是像素的集合。但我看不出它们之间的主要区别(必须用 GPU 做点什么?)

我试图用谷歌搜索,但我发现的所有解释都太复杂了,如果不深入研究计算机图形学的东西,就无法理解它们。

【问题讨论】:

在这里看看我的回答:***.com/questions/21007329/what-is-a-sdl-renderer/… 它将解释SDL_TextureSDL_Surface 以及SDL_Renderer。通常,SDL_Texture 是用于渲染的,但是当您使用SDL_ImageSDL_ttf 加载纹理信息时,您将获得SDL_Surface 形式的数据 @olevegard 这个答案几乎是复制粘贴,我真的很想有一些知识的答案。 正如你所假设的,SDL_Surface 只是像素的集合,而SDL_Texturean efficient, driver-specific representation of pixel data,这意味着它可以被 GPU wiki.libsdl.org/SDL_Texture 使用。这回答了你的问题吗?你真的应该更深入地研究计算机图形以了解更多 @olevegard 太糟糕了,你没有在答案中写下这个。这是你的机会。 【参考方案1】:

基本上,您的假设“与 GPU 有关系?”是对的。

SDL_Surface 用于软件 渲染。通过软件渲染,正如saloomi2012 正确注意到的那样,您正在使用常规 RAM 来存储图像数据。因此,在大多数情况下,您可以直接访问与表面关联的数据缓冲区,修改其内容,即它正在使用 CPU,因此是 software 名称。

另一方面,

SDL_Texture 用于硬件 渲染,纹理存储在 VRAM 中,您无法像 SDL_Surface 那样直接访问它。渲染操作由 GPU 加速,在内部使用 OpenGL 或 DirectX(仅在 Windows 上可用)API,而后者又使用您的视频硬件,因此 hardware 渲染名称。

毋庸置疑,硬件渲染比软件渲染快几个数量级,应始终被视为主要选项。

【讨论】:

如果硬件加速可用,使用SDL_Surface有什么好处吗?例如。对于小型渲染操作,去硬件的开销是否太大? @Timmos 硬件渲染总是比软件更快。但是,软件表面有一个优点:由于它存储在 CPU 可访问的主存储器中,因此您可以直接向其写入数据。如果您想实时生成纹理,例如作为视频游戏中程序生成的内容,这将很有用。 (但请注意,现在许多类型的程序生成也可以使用着色器在 GPU 上完成。) @Timmos 您可以完全控制表面的工作方式、生成方式、完全读写控制,我的意思是真的......控制是表面给您的。 OpenGL 和此类 API 需要与 GPU 一起使用,因为 GPU 制造商不允许直接访问 GPU,这就是为什么您经常会听到人们抱怨 OpenGL 或 DX 效率低下或者只是这些 API 所做的愚蠢事情,因为他们可以更快或更高效地编写一些东西,但他们不能,因为他们无法访问 GPU。 可以建议为什么SDL_FillRectSDL_RenderFillRect 更快?问:***.com/q/65450100/4632019【参考方案2】:

SDL_Texture 加载到视频卡的 VRAM 中,而不是常规 RAM。

【讨论】:

【参考方案3】:

表面使用您的 RAM,纹理使用您的显卡,速度更快 比表面。

【讨论】:

【参考方案4】:

关于这方面的更多信息:

https://thenumbat.github.io/cpp-course/sdl2/05/05.html

如上一课所述,纹理是 GPU 渲染 相当于曲面。因此,纹理几乎总是由 曲面,使用函数 SDL_CreateTextureFromSurface()。这 函数或多或少符合您的预期——参数是 渲染上下文和创建纹理的表面。与 其他创建函数,失败时返回NULL。

希望对你有帮助!

【讨论】:

以上是关于表面和纹理之间的区别(SDL/一般)的主要内容,如果未能解决你的问题,请参考以下文章

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

将 SDL 表面转换为 GL 纹理时出现问题

SDL 表面像素格式转换

SDL2纹理渲染

贴图纹理材质的区别是什么? 还有shader

SDL 纹理和 CPU\内存问题