Unity 贴图拷贝与性能对比

🌳GetPixels

 var pixels = tex.GetPixels();
 tex2.SetPixels(pixels);
 tex2.Apply();

🌳GetRawTextureData

 var pixels = tex.GetRawTextureData();
 tex2.LoadRawTextureData(pixels);
 tex2.Apply();

🌳RenderTexture

public static void textureToTexture2D(Texture texture, Texture2D texture2D)
{
    if (texture == null)
        throw new ArgumentNullException("texture");

    if (texture2D == null)
        throw new ArgumentNullException("texture2D");

    if (texture.width != texture2D.width || texture.height != texture2D.height)
        throw new ArgumentException("texture and texture2D need to be the same size.");

    RenderTexture prevRT = RenderTexture.active;

    if (texture is RenderTexture)
    {
        RenderTexture.active = (RenderTexture)texture;
        texture2D.ReadPixels(new UnityEngine.Rect(0f, 0f, texture.width, texture.height), 0, 0, false);
        texture2D.Apply(false, false);
    }
    else
    {
        RenderTexture tempRT = RenderTexture.GetTemporary(texture.width, texture.height, 0, RenderTextureFormat.ARGB32);
        Graphics.Blit(texture, tempRT);

        RenderTexture.active = tempRT;
        texture2D.ReadPixels(new UnityEngine.Rect(0f, 0f, texture.width, texture.height), 0, 0, false);
        texture2D.Apply(false, false);
        RenderTexture.ReleaseTemporary(tempRT);
    }

    RenderTexture.active = prevRT;
}

🌳Graphics.CopyTexture

不需要apply!!!

Graphics.CopyTexture(tex1, tex2);

🌭性能对比

在测试环境每帧调用 把Texture2D拷贝到另一张Texture2D上。

Methodcpu (基于已有工程测试,只改变拷贝方法)
GetPixels20.3ms
RenderTexture7.9ms
GetRawTextureData8.8ms
Graphics.CopyTexture5.2ms
### 如何在 Unity 中复制光照贴图Unity 中,光照贴图是用于优化性能并提供高质量照明效果的重要工具。然而,Unity 并未直接提供简单的“复制”功能来处理光照贴图。为了实现这一目标,通常需要通过手动操作或脚本化方式完成。 #### 方法一:导出导入光照贴图资源 一种方法是从项目中提取已有的光照贴图文件,并将其应用到另一个场景或其他项目中: 1. **定位光照贴图** 打开 `Window` -> `Rendering` -> `Lighting Settings` 面板,在这里可以看到当前项目的全局光照设置以及生成的光照贴图纹理[^3]。 2. **保存光照贴图** 寻找光照贴图的具体路径,一般位于 `Project` 文件夹下的 `LightingData.asset` 或者特定目录内。可以通过右键点击该资产并选择 “Show in Explorer/Finder”。 3. **迁移光照贴图** 将找到的光照贴图文件拷贝至新的项目位置;如果是在同一项目内部,则可以直接拖拽到所需的目标场景中。 4. **重新链接光照贴图** 在目标场景中打开相同的面板 (`Window` -> `Rendering` -> `Lighting Settings`) ,调整相应的选项使新场景能够识别并使用刚迁入的光照贴图数据。 #### 方法二:编写自定义脚本来批量复制 对于更复杂的多场景管理需求,建议开发一段 C# 脚本来自动化上述流程的一部分工作: ```csharp using UnityEngine; using UnityEditor; public class CopyLightmapUtility : MonoBehaviour { public static void CopyLightmapsToScene(Scene targetScene){ // 获取源场景中的所有静态网格渲染器及其关联的信息 var sourceRenderers = GameObject.FindObjectsOfType<Renderer>().Where(r => r.isPartOfStaticBatch); foreach (Renderer renderer in sourceRenderers){ Renderer correspondingTargetRenderer = FindCorrespondingRendererInOtherScene(renderer, targetScene); if(correspondingTargetRenderer != null){ int lightmapIndex = renderer.lightmapIndex; if(lightmapIndex >= 0 && lightmapIndex < LightmapSettings.lightmaps.Length){ correspondingTargetRenderer.lightmapScaleOffset = renderer.lightmapScaleOffset; correspondingTargetRenderer.lightmapIndex = lightmapIndex; correspondingTargetRenderer.sharedMaterial.SetTexture("_LightMap", LightmapSettings.lightmaps[lightmapIndex].lightmapColor); } } } AssetDatabase.SaveAssets(); EditorSceneManager.MarkAllScenesDirty(); } private static Renderer FindCorrespondingRendererInOtherScene(Renderer originalRenderer, Scene destinationScene){ string objectName = originalRenderer.gameObject.name; Transform foundTransform = destinationScene.GetRootGameObjects().SelectMany(go=>go.transform.Traverse()).FirstOrDefault(t => t.name == objectName)?.transform; return foundTransform?.GetComponent<Renderer>(); } } ``` 这段代码实现了遍历指定场景内的所有带有光照贴图信息的对象,并尝试寻找匹配项以便于将光照属性同步过去。需要注意的是此方案假设两个场景之间存在相似结构的游戏对象命名规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牙膏上的小苏打2333

哟,哟,切克闹,煎饼果子来一套

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值