在Unity

时间:2017-05-19 06:27:17

标签: opengl unity3d unity5

我在Unity中有一个纹理,我会经常修改。 现在有两种选择:

  1. 我可以通过调用setPixels来修改纹理,然后调用Texture2D.apply。我认为apply实际上将数据从CPU复制到GPU。
  2. 一个选项是我可以通过获取纹理本机句柄并使用glTexSubImage2D函数修改它来修改本机代码中的纹理。
  3. 现在我只将改变后的像素复制到GPU而不是完整纹理,但我真的怀疑它是否可能。但如果是真的,这意味着调用Texture2D.apply == glTexSubImage2Din性能方面。

    如果没有,如果我需要良好的表现,我该怎么用?我实际上不想去本地,因为我必须管理Unity支持的不同图形API的本机代码,如opengl,DX等

2 个答案:

答案 0 :(得分:2)

Texture2D.Apply()glTexSubImage2D都用于更新纹理。他们都执行相同的操作,但他们有不同的行为。

  • GetPixelsSetPixelsTexture2D.Apply()已在CPU上完成。
  • 如果您需要单独的像素,则使用GetPixelsSetPixelsTexture2D.Apply()。这方面的好例子是你想通过网络发送纹理数据。
  • glTexSubImage2D在GPU上完成,不需要SetPixelsGetPixels
  • glTexSubImage2DGetPixelsSetPixelsTexture2D.Apply()快得多。
  

如果没有,如果我需要良好的表现,我该怎么用?我其实不   我想要去原生方面,因为我必须管理本机代码   对于Unity支持的不同图形API,如opengl,

您提到您将经常修改图片,因此不要使用 GetPixelsSetPixelsTexture2D.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可用于更新较大纹理的较小矩形部分。