Unity:GetPixels() 始终导致整个图像呈黑色
Unity: GetPixels() always results in the colour black across whole image
我有一张图片(已附上)用作测试。我正在尝试获取每个像素的所有颜色并将其存储在一个数组中。
我使用下面的代码来做到这一点;
Texture2D tex = mapImage.mainTexture as Texture2D;
int w = tex.width;
int h = tex.height;
Vector4[,] vals = new Vector4[w, h];
Color[] cols = tex.GetPixels();
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
if(cols[y+x] != Color.black)
{
Debug.Break();
}
vals[x, y] = cols[(y + x)];
}
}
其中 mapImage 是一个 public Material 变量,我将其拖入预制件的场景中。如您所见,我在那里添加了一个调试测试,以便在达到非黑色时暂停编辑器。这永远不会受到打击。
有趣的是,我有另一个脚本运行并告诉我使用相同图像在点击位置的颜色值 (GetPixel())。它工作正常(不同的方法,但最终都使用相同的material)
我不知道为什么 GetPixels() 总是显示黑色?
我也一直在考虑将图像数据加载到字节数组中,然后将值解析为 Vector4,但希望这最终会起作用。
您没有正确索引到 Color
数组。使用您使用的索引,y+x
,您不断检查纹理最低行上的相同值,永远不会超过某个点。
相反,在计算索引时,您需要将您所在的行乘以行长度并将其添加到您所在的列:
Texture2D tex = mapImage.mainTexture as Texture2D;
int w = tex.width;
int h = tex.height;
Vector4[,] vals = new Vector4[w, h];
Color[] cols = tex.GetPixels();
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
int index = y * w + x;
vals[x, y] = cols[index];
}
}
来自 GetPixels
上的文档:
The returned array is a flattened 2D array, where pixels are laid out left to right, bottom to top (i.e. row after row). Array size is width by height of the mip level used. The default mip level is zero (the base texture) in which case the size is just the size of the texture. In general case, mip level size is mipWidth=max(1,width>>miplevel)
and similarly for height.
我有一张图片(已附上)用作测试。我正在尝试获取每个像素的所有颜色并将其存储在一个数组中。
我使用下面的代码来做到这一点;
Texture2D tex = mapImage.mainTexture as Texture2D;
int w = tex.width;
int h = tex.height;
Vector4[,] vals = new Vector4[w, h];
Color[] cols = tex.GetPixels();
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
if(cols[y+x] != Color.black)
{
Debug.Break();
}
vals[x, y] = cols[(y + x)];
}
}
其中 mapImage 是一个 public Material 变量,我将其拖入预制件的场景中。如您所见,我在那里添加了一个调试测试,以便在达到非黑色时暂停编辑器。这永远不会受到打击。
有趣的是,我有另一个脚本运行并告诉我使用相同图像在点击位置的颜色值 (GetPixel())。它工作正常(不同的方法,但最终都使用相同的material)
我不知道为什么 GetPixels() 总是显示黑色?
我也一直在考虑将图像数据加载到字节数组中,然后将值解析为 Vector4,但希望这最终会起作用。
您没有正确索引到 Color
数组。使用您使用的索引,y+x
,您不断检查纹理最低行上的相同值,永远不会超过某个点。
相反,在计算索引时,您需要将您所在的行乘以行长度并将其添加到您所在的列:
Texture2D tex = mapImage.mainTexture as Texture2D;
int w = tex.width;
int h = tex.height;
Vector4[,] vals = new Vector4[w, h];
Color[] cols = tex.GetPixels();
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
int index = y * w + x;
vals[x, y] = cols[index];
}
}
来自 GetPixels
上的文档:
The returned array is a flattened 2D array, where pixels are laid out left to right, bottom to top (i.e. row after row). Array size is width by height of the mip level used. The default mip level is zero (the base texture) in which case the size is just the size of the texture. In general case, mip level size is
mipWidth=max(1,width>>miplevel)
and similarly for height.