1. 概述

理论上,Unity中加载纹理并没有什么难度,只需要将图片放置在Assets文件夹内,就会被识别成纹理,从而可以加载到场景中。但是一旦有一些额外的需求的时候,就得使用其他的方式进行纹理加载。

2. 详论

2.1. Resources方式

使用Resources机制来加载Unity的各种资源,包括纹理:

Texture2D texture = Resources.Load<Texture2D>("ImageDemo");

Resources是Unity程序自带的的资源管理。Resources这个机制特别适用于游戏,对于游戏来说,所有的纹理、材质、Shader等都可以作为游戏的内置资源。

2.2. API方式

考虑这个情况:如果我们要处理的数据来自资源之外,也就是存在操作系统的资源文件夹中。这种情况Resources就无法使用了。这种情况我们应该了解一下纹理的使用原理:纹理图片首先是存在硬盘空间中,然后通过CPU读取到内存,最后数据交换到GPU的显存中。

一种方法是可以借鉴图像处理的办法,如GDAL、OpenCV等(甚至可以自己通过File实现)组件,将图像读取到内存中,组织成Unity脚本类Texture2d需要的buffer:

int width = 512;
int height = 512;
texture = new Texture2D(width, height, TextureFormat.RGB24, false); byte[] imgData = new byte[width * height * 3]; for(int yi = 0; yi< 128; yi++)
{
for(int xi = 0; xi < 128; xi++)
{
int m = width * 3 * yi + 3 * xi;
imgData[m] = 135;
imgData[m+1] = 206;
imgData[m+2] = 235;
}
} texture.SetPixelData(imgData, 0, 0);
texture.Apply(false, false);

我将内存buffer前128*128个像素buffer填充成蓝色,最终显示为:

也就是纹理buffer也是按照左下角起点的。

Apply()这个函数不能少,因为这个函数是将内存的纹理数据上传到GPU的显存中,而且比较耗费性能。最好在更改像素值完成之后,才调用一次Apply()上传到GPU。

2.3. Web方式

除了本地,资源有时候也会被放置到远端服务器上。对此Unity提供了WWW类作为访问的接口,但是已经废弃。现在Unity提供UnityWebRequest类作为与Web服务器进行通信的接口,与访问远端Texture相关的类还有UnityWebRequestTexture。简单研究了这一套接口,似乎还提供异步方法。

不过实际使用中我并没有使用这套接口。因为我想把一部分工作放到多线程中。我们知道Unity与渲染或者资源相关的内容是不能放置到多线程的,但是访问远端数据、并且读取到内存这部分内容是可以放置到多线程的。所以改进方式也很简单:

  1. 使用C#的WebRequest接口(其他网络传输接口也行),一般网络传输的接口是可以放置在多线程中的。
  2. 将获取到的文件流进行解析,获取RGB格式的内存Buffer。这一步也可以放置在多线程中。
  3. 在主线程将内存Buffer塞入到Texture2D中。

代码地址

最新文章

  1. RPM软件包管理的查询功能
  2. ios 5
  3. bnuoj 20834 Excessive Space Remover(水水)
  4. svn访问权限控制
  5. [IO] C# DirFileHelper文件与文件夹操作类教程与源码下载 (转载)
  6. DateADD日期Sql
  7. ASP.NET 无权访问所请求的资源。请考虑对 ASP.NET 请求标识授予访问此资源的权限。
  8. vi/vim经常使用命令
  9. 花了一年时间开发的TTF2FNT字库转换软件
  10. Github上的原文XMPP环境搭建步骤,英语能力差不多的可以看看
  11. 关于课堂测试ATM系统的总结
  12. rtp传输音视频(纯c代码)
  13. SecureRandom
  14. 寻找复杂背景下物体的轮廓(OpenCV / C++ - Filling holes)
  15. Intellij IDEA 安装配置Gradle
  16. ngnix笔记
  17. iOS.UITableView.SectionIndex
  18. The 10 Best Neighborhoods in Seattle
  19. Win10 + vs2017 编译并配置tesseract4.1.0
  20. vector库的用法

热门文章

  1. 1.9 初学者应选择哪个Linux发行版?
  2. 全网显示 IP 归属地,这背后的技术你知道吗?
  3. CentOS7安装部署Mongodb
  4. 探索ABP基础架构
  5. if判断+while循环
  6. nginx 主运行配置详解(nginx.conf)
  7. 01C语言基础(二)
  8. OI中组合数学公式和定理90%歼灭
  9. Vue出现Component template should ...
  10. 图文详解MapReduce工作机制