Files
com.misaki.hdrp-toon/Editor/SSS/SubsurfaceLookupTextureIntegrator.cs
2024-08-15 17:00:11 +09:00

120 lines
4.3 KiB
C#

using UnityEditor;
using UnityEngine;
namespace EditorTools
{
public class SubsurfaceLookupTextureIntegratorWindow : EditorWindow
{
[MenuItem("Tools/Subsurface LUT Integrator", false, 1000)]
static void ShowIntegratorWindow()
{
GetWindow(typeof(SubsurfaceLookupTextureIntegratorWindow), false, "Subsurface LUT Integrator");
}
private Color FalloffColor = new Color(1.0f, 0.3f, 0.2f);
private float Radius = 4;
private bool KeepDirectBounce = false;
[SerializeField]
private ComputeShader IntegratorShader;
private RenderTexture IntegratedLUT = null;
private int resolution = 512;
private void OnEnable()
{
//IntegratorShader = AssetDatabase.LoadAssetAtPath<ComputeShader>("Assets/Scripts/Tools/Editor/SSS/SubsurfaceLookupTextureIntegrator.compute");
}
private void OnDestroy()
{
if (IntegratedLUT != null)
{
RenderTexture.ReleaseTemporary(IntegratedLUT);
}
}
void OnGUI()
{
GUILayout.Label("Base Settings", EditorStyles.boldLabel);
EditorGUI.BeginChangeCheck();
FalloffColor = EditorGUILayout.ColorField("Fallof Color", FalloffColor);
Radius = EditorGUILayout.Slider("Radius", Radius, 0, 20);
KeepDirectBounce = EditorGUILayout.Toggle("Keep Direct Bounce", KeepDirectBounce);
resolution = EditorGUILayout.IntField("Resolution", resolution);
if (EditorGUI.EndChangeCheck())
{
Bake();
}
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Bake") && IntegratorShader != null)
{
Bake();
}
if (GUILayout.Button("Save") && IntegratedLUT != null)
{
IntegratorShader.SetFloat("_Resoultion", (float)resolution);
RenderTexture rt = RenderTexture.GetTemporary(resolution, resolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
Graphics.Blit(IntegratedLUT, rt);
RenderTexture.active = rt;
Texture2D tex = new Texture2D(resolution, resolution, TextureFormat.ARGB32, false, true);
tex.ReadPixels(new Rect(0, 0, resolution, resolution), 0, 0);
RenderTexture.active = null;
RenderTexture.ReleaseTemporary(rt);
string path = EditorUtility.SaveFilePanel("Export Texture", Application.dataPath, "SSS_Lut", "png");
if (path == null) return;
System.IO.File.WriteAllBytes(path, tex.EncodeToPNG());
AssetDatabase.Refresh();
IntegratorShader.SetFloat("_Resoultion", (float)resolution);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
float width = position.width - 100;
float height = position.height - 189;
float sacle = width > height ? height / resolution : width / resolution;
Rect rect = new Rect(50, 150, resolution * sacle, resolution * sacle);
if (IntegratedLUT != null)
{
EditorGUI.DrawPreviewTexture(rect, IntegratedLUT);
}
else
{
EditorGUI.DrawRect(rect, Color.black);
}
}
private void Bake()
{
if (IntegratedLUT != null)
{
RenderTexture.ReleaseTemporary(IntegratedLUT);
}
IntegratedLUT = RenderTexture.GetTemporary(resolution, resolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
IntegratedLUT.enableRandomWrite = true;
if (KeepDirectBounce)
{
IntegratorShader.EnableKeyword("KEEP_DIRECT_BOUNCE");
}
else
{
IntegratorShader.DisableKeyword("KEEP_DIRECT_BOUNCE");
}
IntegratorShader.SetTexture(0, "_IntegratedLUT", IntegratedLUT);
IntegratorShader.SetVector("_FalloffColor", FalloffColor);
IntegratorShader.SetFloat("_Radius", Radius);
IntegratorShader.SetFloat("_Resoultion", (float)resolution);
IntegratorShader.Dispatch(0, resolution / 8, resolution / 8, 1);
}
}
}