获取模型的材质球贴图中的像素点色值,可以计算模型贴图的RGB、或某个色值的占比,也可以动态修改指定像素色值。
方式一:
获取可读的贴图,并遍历像素点:(通过Texture获取Texture2D操作的运算量比较大,耗时长,推荐方式二)
void CalculateColor()
{
//获取网格
MeshRenderer meshRenderer = transform.GetComponent<MeshRenderer>();
if (meshRenderer == null)
return;
//默认第一个材质球
Material material = meshRenderer.material;
//如果有多个材质球,按顺序获取
//Material material = meshRenderer.materials[0];
//获取材质贴图
Texture texture = material.mainTexture;
//通过名字获取其他贴图
//Texture texture = material.GetTexture("TextureName");
//创建新渲染纹理
RenderTexture renderTexture = RenderTexture.GetTemporary(texture.width, texture.height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
//创建可读的Texture2D
Texture2D texture2D = new Texture2D(texture.width, texture.height, TextureFormat.ARGB32, false);
//记录原RenderTexture激活的渲染纹理
RenderTexture oldActive = RenderTexture.active;
//位块传送,拷贝texture纹理到renderTexture
Graphics.Blit(texture, renderTexture);
//修改RenderTexture的渲染纹理
RenderTexture.active = renderTexture;
//读取RenderTexture的渲染纹理像素信息,存储为纹理数据(Texture2D)
texture2D.ReadPixels(new Rect(0, 0, texture.width, texture.height), 0, 0);
//还原RenderTexture的原渲染纹理
RenderTexture.active = oldActive;
//释放临时渲染纹理
RenderTexture.ReleaseTemporary(renderTexture);
//应用前面对texture2D的操作
texture2D.Apply();
// ----------
//texture2D宽高
int pixelWidth = texture2D.width;
int pixelHeight = texture2D.height;
//获取Color32格式的像素颜色块
pixels32 = texture2D.GetPixels32();
//遍历所有像素
for (int y = 0; y < pixelHeight; y += downsample)
{
for (int x = 0; x < pixelWidth; x += downsample)
{
Color32 pixelColor32 = pixels32[y * pixelWidth + x];
//在此获得每个像素色值信息
}
}
}
方式二:
获取可读的贴图,遍历像素点,并修改色值:(简化方式一,但要将图片改为可读写状态)
void CalculateColor02()
{
//获取网格
MeshRenderer meshRenderer = transform.GetComponent<MeshRenderer>();
if (meshRenderer == null)
return;
//默认第一个材质球
Material material = meshRenderer.material;
//如果有多个材质球,按顺序获取
//Material material = meshRenderer.materials[0];
//获取可读贴图
Texture2D texture2D = material.mainTexture as Texture2D;
// ----------
//texture2D宽高
int pixelWidth = texture2D.width;
int pixelHeight = texture2D.height;
//获取Color32格式的像素颜色块
pixels32 = texture2D.GetPixels32();
//遍历所有像素
for (int y = 0; y < pixelHeight; y += downsample)
{
for (int x = 0; x < pixelWidth; x += downsample)
{
//在此获得每个像素色值信息
Color32 pixelColor32 = pixels32[y * pixelWidth + x];
//修改色值
texture2D.SetPixel(x, y, pixelColor32);
}
}
}