版本:Unity 6 (6000.0)
语言中文
  • C#

Texture3D.GetPixelData

提出建议变更

成功!

感谢您帮助我们提升 Unity 文档的质量。虽然我们无法接受所有意见,但我们会阅读用户建议的每项变更,并在必要时进行更新。

关闭

提交失败

出于某种原因,您建议的变更无法提交。请在几分钟后<a>重试</a>。感谢您花时间帮助我们提高 Unity 文档的质量。

关闭

取消

切换到手册

声明

public NativeArray<T> GetPixelData(int mipLevel);

参数

mipLevel 要从此级别读取的渐进贴图。范围是 0 到纹理的 Texture.mipmapCount。默认值是 0

返回

NativeArray<T> 一个本地数组,它直接指向 CPU 内存中纹理的数据缓冲区。

描述

获取纹理的原始数据。

此方法会返回一个 NativeArray<T0>,它直接指向 CPU 上纹理的数据并具有渐进贴图级别的尺寸。该数组不包含数据的副本,因此 GetPixelData 不会分配任何内存。

例如,如果纹理格式为 16 × 16 × 16 像素和 RGBA32,并且将 mipLevel 设置为 1,如果对 T 使用 Color32(每个像素 4 个字节),则该方法会返回一个具有 512 个元素(8 × 8 × 8 像素)和 2048 个字节大小的数组。您可以使用实验性的 GraphicsFormatUtility.ComputeMipmapSize API 来计算渐进贴图级别的尺寸。

对于 T,您通常会使用匹配纹理中像素结构的结构,例如,如果纹理格式使用 32 位格式的 RGBA 像素,如 TextureFormat.RGBA32,则使用 Color32

您可以读取和写入返回的数组,以直接在 CPU 内存中获取和更改数据。如果写入数组,您必须调用 Apply 方法以将纹理上载到 GPU。

立即使用返回的数组。如果您存储该数组并在之后使用,如果纹理已修改或更新,则该数组可能指向不正确的内存位置。

如果您对 T 使用小的类型,例如 byteGetPixelData,则可能会失败,因为 NativeArray 将超过最大长度 (Int32.MaxValue)。要避免这种情况,请使用更大的类型或结构体。

失败时,GetPixelData 会抛出一个异常。

其他资源:应用设置像素设置像素32获取像素数据

using UnityEngine;

public class ExampleScript : MonoBehaviour { public void Start() { // Create a 3D texture var m_Texture3D = new Texture3D(16, 16, 16, TextureFormat.RGBA32, true);

// Use GetPixelData to get an array that points to mipmap level 1 var mip1Data = m_Texture3D.GetPixelData<Color32>(1);

// Fill pixels in mipmap level 1 with white for (int i = 0; i < mip1Data.Length; i++) { mip1Data[i] = new Color32(255, 255, 255, 255); }

// Copy the texture changes to the GPU m_Texture3D.Apply(false); } }