问题
- 想从纹理中取得像素值。
- 但不愿将纹理设为“readable(可读的)”。
原因
如要使用Texture2D.GetPixels,需要在纹理导入设置中勾选”Read/Write Enable”,这样才能在脚本中访问纹理的数据。
与Unity编辑器可以从纹理中获取预览图类似,我们有时也希望在不将纹理设置为可读的前提下访问像素值。
解决方案
可以使用RenderTexture来实现,具体请参考如下代码:
“texture”是希望读取的纹理,且并未在导入设置中将其设为可读。
// 创建一张和texture大小相等的临时RenderTexture
RenderTexture tmp = RenderTexture.GetTemporary(
texture.width,
texture.height,
0,
RenderTextureFormat.Default,
RenderTextureReadWrite.Linear);
// 将texture的像素复制到RenderTexture
Graphics.Blit(texture, tmp);
// 备份当前设置的RenderTexture
RenderTexture previous = RenderTexture.active;
// 将创建的临时纹理tmp设置为当前RenderTexture
RenderTexture.active = tmp;
// 创建一张新的可读Texture2D,并拷贝像素值
Texture2D myTexture2D = new Texture2D(texture.width, texture.height);
// 将RenderTexture的像素值拷贝到新的纹理中
myTexture2D.ReadPixels(new Rect(0, 0, tmp.width, tmp.height), 0, 0);
myTexture2D.Apply();
// 重置激活的RenderTexture
RenderTexture.active = previous;
// 释放临时RenderTexture
RenderTexture.ReleaseTemporary(tmp);
// "myTexture2D"是可读纹理,并且和”texture”拥有相同的像素值
现在可以对"myTexture2D"进行读写了。
更多信息
http://docs.unity3d.com/ScriptReference/RenderTexture.GetTemporary.html
http://docs.unity3d.com/ScriptReference/Graphics.Blit.html
http://docs.unity3d.com/ScriptReference/Texture2D.ReadPixels.html