NativeArray<T> Raw texture data view.
Get raw data from a texture for reading or writing.
This function returns a direct "view" into the texture pixel data as a Unity.Collections.NativeArray
.
The data contains the entire texture according to its width, height, data format and mipmapCount. Mipmaps are laid out in memory starting from largest, with smaller mip level data immediately following. For example, a 16x8 texture of RGBA32 format with no mipmaps will result in a 512-byte array (16x8x4), or a 128-element array if Color32 is used as a type.
You can read from and write to the returned array. If you write to it, you must call the Apply method to upload the texture to the GPU.
GetRawTextureData does not allocate memory; the returned NativeArray
directly points to the texture system memory data buffer. Therefore, this is the fastest way to access the pixel data.
Note: The returned array can become invalid (i.e. it no longer points to valid memory) if modifications or uploads happen to the texture after you call this method. Therefore the recommended way to use this method is to get the data, and use or modify it immediately. You should not store the returned array for later use.
See Also: Apply, SetPixels, SetPixels32, LoadRawTextureData, GetPixelData.
using UnityEngine;
public class ExampleScript : MonoBehaviour { void Start() { var texture = new Texture2D(128, 128, TextureFormat.RGBA32, false); GetComponent<Renderer>().material.mainTexture = texture;
// RGBA32 texture format data layout exactly matches Color32 struct var data = texture.GetRawTextureData<Color32>();
// fill texture data with a simple pattern Color32 orange = new Color32(255, 165, 0, 255); Color32 teal = new Color32(0, 128, 128, 255); int index = 0; for (int y = 0; y < texture.height; y++) { for (int x = 0; x < texture.width; x++) { data[index++] = ((x & y) == 0 ? orange : teal); } } // upload to the GPU texture.Apply(); } }
byte[] Raw texture data as a byte array.
Get raw data from a texture.
This function returns the raw texture data as a byte array, which you can then use with Texture2D.LoadRawTextureData. This allows you to serialize and load textures of any format (including compressed ones), and to load them back into a texture later.
Note that this function returns Unity's system memory copy of the texture data, so Texture.isReadable must be true
.
This untemplated function returns a copy of the data. If you don't need a copy or if you want to modify the data directly, use the templated version of this function. The templated function is faster because it does not make a copy.
Also note that the system memory copy might not match what is in the GPU texture data at the moment. For example,
after calling SetPixels the system memory copy is already modified, but the GPU copy will only match after calling
Apply(). Some cases of Graphics.CopyTexture might be copying only the GPU texture side (e.g. copying from a
RenderTexture into a Texture2D), and this will not be reflected in GetRawTextureData contents.
using UnityEngine;
class CopyTexture : MonoBehaviour { // the source texture. Texture2D tex;
void Start() { // Create a copy of the texture by reading and applying the raw texture data. Texture2D texCopy = new Texture2D(tex.width, tex.height, tex.format, tex.mipmapCount > 1); texCopy.LoadRawTextureData(tex.GetRawTextureData()); texCopy.Apply(); } }