2022. 2. 12. 04:53
Unity
SetPixel
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];
}
}
렌더텍스처 픽셀 가져오기
원문코드는 이곳에서 가져왔다 https://docs.unity3d.com/kr/530/ScriptReference/RenderTexture-active.html
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);
}
SaveRenderWindow
https://gist.github.com/ahzkwid/10974a8f59c215ea02a9e5a35e533f66
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
//https://gist.github.com/ahzkwid/10974a8f59c215ea02a9e5a35e533f66
using UnityEditor;
[InitializeOnLoad]
class SaveRenderWindow : EditorWindow
{
public RenderTexture targetRenderTexture;
[UnityEditor.MenuItem("Ahzkwid/" + nameof(SaveRenderWindow))]
public static void Init()
{
GetWindow<SaveRenderWindow>(false, nameof(SaveRenderWindow));
}
SerializedObject serializedObject;
void OnGUI()
{
if (serializedObject == null)
{
serializedObject = new SerializedObject(this);
}
serializedObject.Update();
{
EditorGUILayout.Space();
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(targetRenderTexture)));
}
serializedObject.ApplyModifiedProperties();
if (GUILayout.Button("Save"))
{
SaveRenderTexture();
}
}
static public Texture2D GetRTPixels(RenderTexture rt)
{
//https://docs.unity3d.com/kr/530/ScriptReference/RenderTexture-active.html
RenderTexture currentActiveRT = RenderTexture.active;
RenderTexture.active = rt;
Texture2D tex = new Texture2D(rt.width, rt.height);
tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
RenderTexture.active = currentActiveRT;
return tex;
}
public void SaveRenderTexture()
{
if (targetRenderTexture != null)
{
var fileName = $"{System.DateTime.Now.Ticks}";
var folderPath = $"{Application.persistentDataPath}";
var filePath = $"{folderPath}/{fileName}.png";
if (System.IO.Directory.Exists(folderPath) == false)
{
System.IO.Directory.CreateDirectory(folderPath);
}
var texture2D = GetRTPixels(targetRenderTexture);
//var texture2D = new Texture2D(targetRenderTexture.width, targetRenderTexture.height, TextureFormat.RGBA32, false);
//texture2D.SetPixels(targetRenderTexture.GetPixels());
var bytes = texture2D.EncodeToPNG();
System.IO.File.WriteAllBytes(filePath, bytes);
System.Diagnostics.Process.Start(folderPath);
}
}
}
#endif
'Unity' 카테고리의 다른 글
유니티 IOS 인터페이스 (0) | 2022.02.25 |
---|---|
유니티 안드로이드 동영상 관련자료 (0) | 2022.02.11 |
유니티 pb stl 사용법 (0) | 2022.02.08 |