关注

如何获取不可读纹理的像素值?

问题

  • 想从纹理中取得像素值。
  • 但不愿将纹理设为“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

这篇文章有帮助吗?
1 人中有 1 人觉得有帮助
还有其它问题?提交请求

0 评论

登录写评论。