我在Unity中有一个纹理,我会经常修改。 现在有两种选择:
现在我只将改变后的像素复制到GPU而不是完整纹理,但我真的怀疑它是否可能。但如果是真的,这意味着调用Texture2D.apply == glTexSubImage2Din性能方面。
如果没有,如果我需要良好的表现,我该怎么用?我实际上不想去本地,因为我必须管理Unity支持的不同图形API的本机代码,如opengl,DX等
答案 0 :(得分:2)
Texture2D.Apply()
和glTexSubImage2D
都用于更新纹理。他们都执行相同的操作,但他们有不同的行为。
GetPixels
,SetPixels
和Texture2D.Apply()
已在CPU上完成。GetPixels
,SetPixels
和Texture2D.Apply()
。这方面的好例子是你想通过网络发送纹理数据。glTexSubImage2D
在GPU上完成,不需要SetPixels
或
GetPixels
。glTexSubImage2D
比GetPixels
,SetPixels
和Texture2D.Apply()
快得多。如果没有,如果我需要良好的表现,我该怎么用?我其实不 我想要去原生方面,因为我必须管理本机代码 对于Unity支持的不同图形API,如opengl,
您提到您将经常修改图片,因此不要使用 GetPixels
,SetPixels
和Texture2D.Apply()
。我知道这是最简单的解决方案,但速度很慢。
为获得最佳表现:
1 。使用glTexSubImage2D
将Texture.GetNativeTexturePtr()
传递给原始C ++端IntPtr
,然后使用glTexSubImage2D
直接修改它。我注意到你的大部分问题都是关于C ++和OpenGL的,所以这对你这样的人来说应该不会很难。
至于支持不同的图形API,首先支持的是OpenGL,因为所有主要平台都支持它。从编辑器中,将Graphics API更改为OpenGL,然后开始编码。它应该适用于Windows,Mac,Linux,Android和iOS。如果您想支持Direct3D,Metal和Vulkan,那么也可以使用它们。你没必要。 OpenGL就足够了。
<强> 2 即可。使用着色器
您可以将Unity Shaders和Compute Shaders结合使用,并且仍然可以获得比glTexSubImage2D
更高的性能,因为这将发生在GPU而不是CPU上。我个人觉得着色器很复杂,所以#1 应该是你的首选。
答案 1 :(得分:0)
是的,glTexSubImage2D
可用于更新较大纹理的较小矩形部分。