| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> Unity学习笔记 动态复制并创建新的纹理(Texture2D)的方法和说明 -> 正文阅读 |
|
[游戏开发]Unity学习笔记 动态复制并创建新的纹理(Texture2D)的方法和说明 |
实现方法如何实现从一个“源纹理”创建出想要的某大小某个格式的新的Texture呢? 实现的方法有以下几个方法: 方法1:Texture2D.GetPixels + Texture2D .SetPixels = 新纹理
【注意:要使此函数成功,Texture.isReadable必须是true并且数据不能被 Crunch 压缩】
方法2:Texture2D.GetRawTextureData + Texture2D.LoadRawTextureData = 新纹理
【注意:要使此函数成功,创建的纹理格式一定要与源纹理一致,不然会报错提示“Loadrawtexturedata not enough data provided…”】
方法3:RenderTexture + Graphics.Blit 复制纹理 = 新纹理
效率对比
总结理论上来说,若不需要对纹理的数据进行修改的话,创建/复制一个新的纹理最快的方法是在GPU里直接修改是最快的方法。但是因为需求,创建的纹理并不是要实时在显示的,所以这个过程都是要先在CPU上完成后才能在后续应用到GPU上去。 这三个方法当中,造成效率有差异的原因分析如下: 对于方法1来说,因为存在像素需要从浮点格式(颜色为 4 个浮点数)与纹理格式数据之间的转换,GetPixels的时候需要从GPU获取到像素数据到CPU上,SetPixels的时候还需要把像素转成纹理数据才能被GPU使用,所以效率不太高; 而方法2是直接修改纹理内存数据中的像素数据,而且使用GetRawTextureData时不需要额外分配内存;返回的Unity.Collections.NativeArray类型数组直接指向纹理系统内存数据缓冲区。因此,这是访问像素数据的最快方式。 方法3中Graphics.Blit获取像素的功能是靠shader(着色器)实现的,不涉及到CPU上运行的动作,所以会比方法1快一点。但是在创建纹理的时候是在CPU上完成,通过与方法1SetPixels原理类似的ReadPixels,同样涉及到像素与纹理格式之间的转换,所以运行的效率处于方法1和方法2之间。 不过三者各有用处: 方法1 - 优势:
方法1 - 弊端:
方法2 - 优势:
方法2 - 弊端:
方法3 - 优势:
方法3 - 弊端:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/17 4:09:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |