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中。

代码地址

Unity3D学习笔记9——加载纹理的更多相关文章

  1. [WPF学习笔记]动态加载XAML

    好久没写Blogs了,现在在看[WPF编程宝典],决定开始重新写博客,和大家一起分享技术. 在编程时我们常希望界面是动态的,可以随时变换而不需要重新编译自己的代码. 以下是动态加载XAML的一个事例代 ...

  2. 学习笔记TF015:加载图像、图像格式、图像操作、颜色

    TensorFlow支持JPG.PNG图像格式,RGB.RGBA颜色空间.图像用与图像尺寸相同(height*width*chnanel)张量表示.通道表示为包含每个通道颜色数量标量秩1张量.图像所有 ...

  3. Away3D 学习笔记(一): 加载3DS格式的模型文件

    加载外部的3DS文件分为两种: 1: 模型与贴图独立于程序的,也就是从外部的文件夹中读取 private function load3DSFile():Loader3D { loader = new ...

  4. flutter源码学习笔记-图片加载流程

    本文基于1.12.13+hotfix.8版本源码分析. 0.大纲 Image ImageProvider 图片数据加载 ImageStream.ImageStreamCompleter 缓存池 Pai ...

  5. ARM学习笔记4——加载存储指令

    一.字数据传送指令 作用:用于把单一的数据传入或者传出一个寄存器. 1.LDR指令 1.1.作用 根据<addr_mode>所确定的地址模式从内存中将一个32位的字段读取到目标寄存器< ...

  6. Unity3D学习笔记2——绘制一个带纹理的面

    目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...

  7. Unity3D学习笔记12——渲染纹理

    目录 1. 概述 2. 详论 3. 问题 1. 概述 在文章<Unity3D学习笔记11--后处理>中论述了后处理是帧缓存(Framebuffer)技术实现之一:而另外一个帧缓存技术实现就 ...

  8. OpenGL ES学习笔记(三)——纹理

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <OpenGL ES学习笔记( ...

  9. Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条

    Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Ap ...

随机推荐

  1. Java实用类

    //String类常用方法 public int length()//获取String对象的字符序列的长度 n=s.length(); public boolean equals(String s)/ ...

  2. Spring Security之短信登录

    实现短信验证码登录 前面实现了 用户名+密码 的登录方式,现在实现一下短信验证码登录. 开发短信验证码接口 短信验证码和图形验证码类似,用户从手机短信得到验证码和从图片得到验证码类似. 校验短信验证码 ...

  3. Linux用户权限集中管理方案

    一.问题 服务器多,各个服务器上的管理人员多,ROOT权限泛滥,经常导致文件莫名其妙丢失,老手和新手对服务器的熟知程度不同,安全存在不稳定和操作安全隐患. 二.方案 利用sudo配置指定用户只能执行指 ...

  4. 一文带你搞懂 Kafka 的系统架构(深度好文,值得收藏)

    Kafka 简介 Kafka 是一种高吞吐.分布式.基于发布和订阅模型的消息系统,最初是由 LinkedIn 公司采用 Scala 和 java 开发的开源流处理软件平台,目前是 Apache 的开源 ...

  5. Java 对象实现 Serializable 的原因

    java.io.Serializable 是 Java 中的一种标记接口(marker interface).标记接口是一种特殊的接口,java.io.Serializable 接口没有任何方法,也没 ...

  6. 【Java面试】Spring中 BeanFactory和FactoryBean的区别

    一个工作了六年多的粉丝,胸有成竹的去京东面试. 然后被Spring里面的一个问题卡住,唉,我和他说,6年啦,Spring都没搞明白? 那怎么去让面试官给你通过呢? 这个问题是: Spring中Bean ...

  7. Linux系统执行命令方法

    现在我们无论是工作中还是学习中很多情况下用到Linux系统,当我们需要在C#代码中调用类似与cmd窗口执行命令时候,就需要用到此方法 public static Process CommitComma ...

  8. P4169 [Violet]天使玩偶

    两种操作:1.加入点(x,y); 2.查询距(x,y)最近的点的曼哈顿距离距离 思路:绝对值拆开通常可以取max,不过这里直接分类讨论4种情况,我们发现如果找\(i\)点左下点\(j\)\((x_j& ...

  9. Spring Ioc源码分析系列--Bean实例化过程(二)

    Spring Ioc源码分析系列--Bean实例化过程(二) 前言 上篇文章Spring Ioc源码分析系列--Bean实例化过程(一)简单分析了getBean()方法,还记得分析了什么吗?不记得了才 ...

  10. 拭目以待!JNPF .NET将更新.NET 6技术,同时上线 3.4.1 版本

    2022年5月30日,福建引迈即将上线JNPF开发平台的.NET 6版本,在产品性能上做了深度优化,且极大的提升了工作效率,加强了对云服务的改进升级,全面提升用户的使用体验. JNPF是一个以PaaS ...