Unity3D学习笔记9——加载纹理
目录
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与渲染或者资源相关的内容是不能放置到多线程的,但是访问远端数据、并且读取到内存这部分内容是可以放置到多线程的。所以改进方式也很简单:
- 使用C#的WebRequest接口(其他网络传输接口也行),一般网络传输的接口是可以放置在多线程中的。
- 将获取到的文件流进行解析,获取RGB格式的内存Buffer。这一步也可以放置在多线程中。
- 在主线程将内存Buffer塞入到Texture2D中。
相关文章
- Spring学习笔记(三十三)——SpringBoot集成Swagger
- K8S学习笔记之在k8s中删除和添加节点的方法
- C++系列笔记(三)
- html笔记
- 【笔记】《游戏编程算法与技巧》1-6
- 十六、网络编程【黑马JavaSE笔记】
- web前端学习/工作笔记(二)
- LeetCode笔记:Weekly Contest 315
- Servlet学习笔记-Servlet工作原理和过程
- 学习笔记——STM32摄像头OV7725(二)
- STL源码剖析_阅读笔记
- 网络编程学习笔记10-第一个netcat的实现(io-multiplexing)
- [学习笔记]unity3d-UGUI
- 《代码审计》一点儿笔记
- 从零开始的异世界生信学习 linux部分 linux 基础---学习笔记-4 环境变量
- Linux源码学习笔记 day1 开机时如何加载系统?
- CMU 15445 学习笔记—8 Index Concurrency Control
- C++11新特性学习笔记
- 【BLE学习笔记】BLE协议中的16位UUID和128位UUID有啥区别?
- Java学习笔记 基础知识(封装)
- HTML&CSS精选笔记_列表与超链接详解编程语言
- Java数据结构学习笔记之二Java数据结构与算法之栈(Stack)实现详解编程语言
- java学习笔记03–判断与循环语句详解编程语言
- Spring-data-jpa 学习笔记(二)详解编程语言
- 学习笔记:Linux汇编语法入门(linux汇编语法)
- 6天玩转MySQL,记录学习成果(6天玩转mysql 笔记)
- JavaScript学习笔记(六)
- Fedora14Linux系统安装Golang开发环境笔记