updateMipmaps | 当值为 true 时,Unity 会使用 mipmap 等级 0 作为源,重新计算 mipmap 等级。默认值为 true 。 |
makeNoLongerReadable | 当值为 true 时,Unity 会在将纹理上传到 GPU 后删除 CPU 内存中的纹理,并将 isReadable 设置为 false 。默认值为 false 。 |
将您在 CPU 纹理中所做的更改复制到 GPU。
对于大多数类型的纹理,Unity 可以将纹理的副本存储在 CPU 和 GPU 内存中。
CPU 副本是可选的。如果存在 CPU 副本,您可以比 GPU 副本更灵活地读取和写入 CPU 副本,例如使用 GetPixels。但是要渲染更新的纹理,您必须使用 Apply
将其从 CPU 复制到 GPU。
如果您将 makeNoLongerReadable
设置为 true
,Unity 会在将纹理上传到 GPU 后删除 CPU 中的纹理副本。这意味着 Unity 无法重新加载纹理。即使在磁盘上存储数据的纹理资源上调用 Apply
,如果 Unity 一旦丢弃 CPU 副本,它将不再尝试从磁盘重新加载,因为可读纹理数据可能已被更改。这在项目中使用 mipmap 限制以减少上传的 mip 数量时是相关的(例如,参见 QualitySettings.globalTextureMipmapLimit)。在 Apply
中丢弃 CPU 副本后,运行时纹理和可读纹理资源将不再遵循质量设置。纹理的上传分辨率将固定在 Unity 丢弃 CPU 副本时上传到 GPU 的分辨率上。如果这是不可取的,请确保纹理在完全分辨率下上传,无论是导入/构造时还是在运行时使用 Texture2D.ignoreMipmapLimit。
通常,只有在您已经更新了 mipmap 等级(例如,使用 SetPixels)时,您才会将 updateMipmaps
设置为 false
。Apply
是一种昂贵的操作,因为它会复制纹理中的所有像素,即使您只更改了其中一些像素,因此在调用它之前,请尽可能多地更改像素。
// Create a new texture and assign it to the renderer's material using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { void Start() { Texture2D texture = new Texture2D(128, 128); GetComponent<Renderer>().material.mainTexture = texture;
for (int y = 0; y < texture.height; y++) { for (int x = 0; x < texture.width; x++) { Color color = ((x & y) != 0 ? Color.white : Color.gray); texture.SetPixel(x, y, color); } } texture.Apply(); } }
其他资源:SetPixel、SetPixels 函数、Graphics.CopyTexture。