public Texture2D texture2D;
void Start()
{
texture2D = new Texture2D(512,1);
for (int i = 0; i < 512; i++)
{
texture2D.SetPixel(i,0, new Color(1, (float)i / 512, 0, 0.25f));
}
texture2D.Apply();
}
SetPixels
public Texture2D texture2D;
void Start()
{
var colors = new Color[512];
for (int i = 0; i < 512; i++)
{
colors[i] = new Color(1, (float)i / 512, 0, 0.25f);
}
texture2D = new Texture2D(512, 1);
texture2D.SetPixels(0, 0, texture2D.width, texture2D.height, colors);
texture2D.Apply();
}
픽셀 불러오기
var pixels = tex.GetPixels(0, 0, tex.width, tex.height);
for (int x = 0; x < tex.width; x++)
{
for (int y = 0; y < pixels.Length / tex.width; y++)
{
var index = y * tex.width + x;
var pixel = pixels[index];
}
}
static public Texture2D GetRTPixels(RenderTexture rt)
{
// Remember currently active render texture
RenderTexture currentActiveRT = RenderTexture.active;
// Set the supplied RenderTexture as the active one
RenderTexture.active = rt;
// Create a new Texture2D and read the RenderTexture image into it
Texture2D tex = new Texture2D(rt.width, rt.height);
tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
// Restorie previously active render texture
RenderTexture.active = currentActiveRT;
return tex;
}
위 코드 사용 예제
var texture = GetRTPixels(renderTexture);
var pixels = texture.GetPixels(0, 0, texture.width, texture.height, miplevel : 0);
Texture2D 빈 가장자리 제거
static public Texture2D TrimTexture(Texture2D texture)
{
return TrimTexture(texture, Vector2.zero);
}
static public Texture2D TrimTexture(Texture2D texture,Vector2 padding)
{
var rect = new Rect(0, 0, texture.width, texture.height);
{
var pixels = texture.GetPixels(0, 0, texture.width, texture.height);
//x
for (int x = 0; x < texture.width; x++)
{
for (int y = 0; y < pixels.Length / texture.width; y++)
{
var index = x + y * texture.width;
var pixel = pixels[index];
if (pixel.a > 0)
{
rect.x = x;
break;
}
}
if (rect.x != 0)
{
break;
}
}
//y
for (int y = 0; y < pixels.Length / texture.width; y++)
{
for (int x = 0; x < texture.width; x++)
{
var index = x + y * texture.width;
var pixel = pixels[index];
if (pixel.a > 0)
{
rect.y = y;
break;
}
}
if (rect.y != 0)
{
break;
}
}
//width
for (int x = texture.width - 1; x >= 0; x--)
{
for (int y = pixels.Length / texture.width - 1; y >= 0; y--)
{
var index = x + y * texture.width;
var pixel = pixels[index];
if (pixel.a > 0)
{
rect.width = x - rect.x;
break;
}
}
if (rect.width != texture.width)
{
break;
}
}
//height
for (int y = pixels.Length / texture.width - 1; y >= 0; y--)
{
for (int x = texture.width - 1; x >= 0; x--)
{
var index = x + y * texture.width;
var pixel = pixels[index];
if (pixel.a > 0)
{
rect.height = y - rect.y;
break;
}
}
if (rect.height != texture.height)
{
break;
}
}
}
{
var pixels = texture.GetPixels((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
var trimTexture = new Texture2D((int)rect.width+ (int)padding.x*2, (int)rect.height + (int)padding.y * 2);
var defaultPixels = new Color[trimTexture.width * trimTexture.height];
System.Array.ConvertAll(defaultPixels,x=>new Color(0,0,0,0));
trimTexture.SetPixels(0, 0, trimTexture.width, trimTexture.height, defaultPixels);
trimTexture.SetPixels((int)padding.x, (int)padding.y, (int)rect.width, (int)rect.height, pixels);
trimTexture.Apply();
return trimTexture;
}
}
RGB만 바꾸기
만들고 보니 쓸모가 없어졌네
/// <summary>
/// rgb만 바꾸고 a는 그냥 놔둠
/// </summary>
/// <param name="texture"></param>
/// <param name="color"></param>
static public void ChangeRGB(Texture2D texture,Color color)
{
var pixels = texture.GetPixels(0, 0, texture.width, texture.height);
for (int x = 0; x < texture.width; x++)
{
for (int y = 0; y < pixels.Length / texture.width; y++)
{
var index = x + y * texture.width;
pixels[index].r = color.r;
pixels[index].g = color.g;
pixels[index].b = color.b;
}
}
texture.SetPixels(0, 0, texture.width, texture.height, pixels);
}