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. [论文] FRCRN:利用频率递归提升特征表征的单通道语音增强

    本文介绍了ICASSP2022 DNS Challenge第二名阿里和新加坡南阳理工大学的技术方案,该方案针对卷积循环网络对频率特征的提取高度受限于卷积编解码器(Convolutional Encod ...

  2. clientWidth、offsetWidth、scrollWidth……

    1.元素视图属性 clientWidth:元素内容可视区宽度(水平方向 width + 左右 padding). clientHeight:元素内容可视高度(垂直方向 height + 上下paddi ...

  3. ajax与python后端交互

    目录 ajax简介 前后端传输数据编码格式 ajax发送json格式数据 ajax携带文件数据 回调机制处理策略 ajax简介 ajax可以在页面不刷新的情况下可以与后端进行数据交互,异步提交,局部刷 ...

  4. curl-URL请求

    模拟HTTP请求,通过访问URL获取HTTP响应. 语法 curl [选项] 访问URL 选项 --connect-timeout SECONDS 设置最大请求时间. -C, --continue-a ...

  5. webpack及其配置

    Webpack 1.webpack主要用来模块和打包 2.webpack和gulp对比: 什么时候用gulp a.如果你的工程模块依赖非常简单,甚至是没有用到模块化的概念 b.只需要进行简单的合并.压 ...

  6. [gym102978C] Count Min Ratio

    [gym102978C] Count Min Ratio 给定 \(B\) 个蓝色的球. \(R\) 个红色的球以及一个绿色的球,同颜色的球不可区分.对于一种球的排列方式,记 \(l_B,r_B,l_ ...

  7. Lucene开发实例:Lucene中文分词(转载)

    1.准备工作下载lucene 3.6.1 : http://lucene.apache.org/下载中文分词IK Analyzer: http://code.google.com/p/ik-analy ...

  8. USB机械键盘改蓝牙键盘

    手里有两把机械键盘,一个是IKBC 87键,一个是IKBC POKER II 60键,由于买的比较早,两把键盘均为USB的,使用起来桌面线比较多,碍事,于是开始研究如何改成蓝牙键盘. 首先说一下USB ...

  9. 在海思芯片上使用GDB远程调试

    1 前言 使用海思平台上(编译工具链:arm-himix200-linux)交叉编译 GDB 工具(使用版本8.2,之前用过10.2的版本,在编译 gdbserver 遇到编译出错的问题,因为关联了其 ...

  10. 1.1 操作系统的第一个功能——虚拟化硬件资源 -《zobolの操作系统学习札记》

    1.1 操作系统的第一个功能--虚拟化硬件资源 目录 1.1 操作系统的第一个功能--虚拟化硬件资源 问1:操作系统一般处于计算机系统的哪一个位置? 问2:管理硬件资源为什么要单独交给操作系统? 问3 ...