獲取模型的材質球貼圖中的像素點色值,可以計算模型貼圖的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);
}
}
}