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中。
Unity3D学习笔记9——加载纹理的更多相关文章
- [WPF学习笔记]动态加载XAML
好久没写Blogs了,现在在看[WPF编程宝典],决定开始重新写博客,和大家一起分享技术. 在编程时我们常希望界面是动态的,可以随时变换而不需要重新编译自己的代码. 以下是动态加载XAML的一个事例代 ...
- 学习笔记TF015:加载图像、图像格式、图像操作、颜色
TensorFlow支持JPG.PNG图像格式,RGB.RGBA颜色空间.图像用与图像尺寸相同(height*width*chnanel)张量表示.通道表示为包含每个通道颜色数量标量秩1张量.图像所有 ...
- Away3D 学习笔记(一): 加载3DS格式的模型文件
加载外部的3DS文件分为两种: 1: 模型与贴图独立于程序的,也就是从外部的文件夹中读取 private function load3DSFile():Loader3D { loader = new ...
- flutter源码学习笔记-图片加载流程
本文基于1.12.13+hotfix.8版本源码分析. 0.大纲 Image ImageProvider 图片数据加载 ImageStream.ImageStreamCompleter 缓存池 Pai ...
- ARM学习笔记4——加载存储指令
一.字数据传送指令 作用:用于把单一的数据传入或者传出一个寄存器. 1.LDR指令 1.1.作用 根据<addr_mode>所确定的地址模式从内存中将一个32位的字段读取到目标寄存器< ...
- Unity3D学习笔记2——绘制一个带纹理的面
目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...
- Unity3D学习笔记12——渲染纹理
目录 1. 概述 2. 详论 3. 问题 1. 概述 在文章<Unity3D学习笔记11--后处理>中论述了后处理是帧缓存(Framebuffer)技术实现之一:而另外一个帧缓存技术实现就 ...
- OpenGL ES学习笔记(三)——纹理
首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <OpenGL ES学习笔记( ...
- Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条
Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Ap ...
随机推荐
- Go语言学习——指针、new和make
指针 Go语言中不存在指针操作,只需要记住两个符号: &:取地址 *:根据地址取值 vscode 打开多个标签页 settings.json中输入"workbench.editor. ...
- NuGet包管理平台
这节来讲一下.NET下的包管理平台:NuGet. 我们做一个项目,除了自己的代码文件之外,实际上还要引用诸多代码文件,这些文件可能是我们自己封装的底层框架代码,或者为了完成某个功能而引用的工具类文件等 ...
- call()、apply()、arguments
一.call(),apply() 1.作为函数对象(指函数方法名,不带括号)的方法,需要通过函数对象调用:当对函数调用这两个方法时都会调用函数执行. <script> // 这个函数中,f ...
- 超全面!1.5w字总结50个Java经典基础面试题(已根据知识点分类)
大家好,我是fancy. 在面试中将基础问题回答好就是成功的一半. 我总结了50道经典的Java基础面试题,里面包含面试要回答的知识重点,并且我根据知识类型进行了分类,可以说非常全面了. 小伙伴们点赞 ...
- RabbitMQ 3.9( 续 )
前言 基础篇链接:https://www.cnblogs.com/xiegongzi/p/16229678.html 3.9.延迟队列 - 重要 3.9.1.延迟队列概念 这个玩意儿要表达的意思其实已 ...
- [ Module ] 环境变量管理工具 Module 安装和使用
https://www.cnblogs.com/yeungchie/ 1. 工具下载 手动下载 modules-5.1.0 点击下载 wget 下载 wget https://jaist.dl.sou ...
- 好客租房4-react的基本使用 方法说明
2.2方法说明 React.createElement //第二步创建react元素 //参数1:元素名称 //参数2:元素属性 //参数3:元素的子节 ...
- 129_Power Pivot&Power BI DAX不同维度动态展示&动态坐标轴
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 某天在和那还是叫我大铁吧 交流关于季度&月度同时展示的问题,感概中国式报表真的需求很微妙. 下面来看看到 ...
- 一次生产环境的docker MySQL故障
问题 昨天下午本来要去吃下午茶,然后前端小伙伴突然说接口怎么崩了,我登上sentry一看,报错了 (2005, "Unknown MySQL server host 'mysql' (-3) ...
- Vben Admin 源码学习:状态管理-错误日志
0x00 前言 本文将对 Vue-Vben-Admin 的状态管理实现源码进行分析解读,耐心读完,相信您一定会有所收获! 0x01 errorLog.ts 错误日志 文件 src\store\modu ...