매 Update 프레임에서 쓰기에는 오버헤드가 커서 사용하면 안된다.
그래도 어딘가 누군가에게는 도움이 될거라 생각해서 수집한 내용 기록..
# 출처 : https://answers.unity.com/questions/685656/rotate-an-image-by-modifying-texture2dgetpixels32.html
public static Texture2D RotateImage(Texture2D originTexture, int angle)
{
Texture2D result;
result = new Texture2D(originTexture.width, originTexture.height);
Color32[] pix1 = result.GetPixels32();
Color32[] pix2 = originTexture.GetPixels32();
int W = originTexture.width;
int H = originTexture.height;
int x = 0;
int y = 0;
Color32[] pix3 = rotateSquare(pix2, (Math.PI / 180 * (double)angle), originTexture);
for (int j = 0; j < H; j++)
{
for (var i = 0; i < W; i++)
{
//pix1[result.width/2 - originTexture.width/2 + x + i + result.width*(result.height/2-originTexture.height/2+j+y)] = pix2[i + j*originTexture.width];
pix1[result.width / 2 - W / 2 + x + i + result.width * (result.height / 2 - H / 2 + j + y)] = pix3[i + j * W];
}
}
result.SetPixels32(pix1);
result.Apply();
return result;
}
static Color32[] rotateSquare(Color32[] arr, double phi, Texture2D originTexture)
{
int x;
int y;
int i;
int j;
double sn = Math.Sin(phi);
double cs = Math.Cos(phi);
Color32[] arr2 = originTexture.GetPixels32();
int W = originTexture.width;
int H = originTexture.height;
int xc = W / 2;
int yc = H / 2;
for (j = 0; j < H; j++)
{
for (i = 0; i < W; i++)
{
arr2[j * W + i] = new Color32(0, 0, 0, 0);
x = (int)(cs * (i - xc) + sn * (j - yc) + xc);
y = (int)(-sn * (i - xc) + cs * (j - yc) + yc);
if ((x > -1) && (x < W) && (y > -1) && (y < H))
{
arr2[j * W + i] = arr[y * W + x];
}
}
}
return arr2;
}
그렇게 저에게 도움이 되었습니다 감사합니다^^
답글삭제