Files
beyond/Assets/testy/ParticleSDFTest/MeshToSDF/computeTest.cs
2024-11-20 15:21:28 +01:00

115 lines
3.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.VFX;
[ExecuteAlways]
public class computeTest : MonoBehaviour
{
public bool executeInEditMode = false;
public bool updateTexture = false;
public bool createTexture = false;
public int texResolution = 256;
public Material testMaterial;
int kernel;
public ComputeShader debugCompute;
public RenderTexture debugTexture;
public string materialProperty = "_Texture3D";
[Tooltip("Visual effect whose property to set with the output SDF texture")]
public VisualEffect vfxOutput;
public string vfxProperty = "Texture3D";
#if UNITY_EDITOR
private void OnValidate()
{
Awake();
}
#endif
private void Initialize()
{
//kernel = debugCompute.FindKernel("CSMain");
kernel = debugCompute.FindKernel("DebugSphere");
}
// Start is called before the first frame update
void Awake()
{
Initialize();
}
void CreateTexture()
{
debugTexture = new RenderTexture(texResolution, texResolution,
// 0, RenderTextureFormat.ARGBHalf);
0, RenderTextureFormat.RFloat);
debugTexture.dimension = UnityEngine.Rendering.TextureDimension.Tex3D;
debugTexture.enableRandomWrite = true;
debugTexture.useMipMap = false;
debugTexture.anisoLevel = 1;
debugTexture.volumeDepth = texResolution;
debugTexture.Create();
}
void UpdateTexture()
{
int texSize = debugTexture.width;
debugCompute.SetTexture(kernel, "Result", debugTexture);
int dispatchCubeSize = debugTexture.width;
debugCompute.SetInt("dispatchCubeSide", dispatchCubeSize);
debugCompute.Dispatch(kernel, numGroups(debugTexture.width, 8),
numGroups(debugTexture.height, 8), numGroups(debugTexture.volumeDepth, 8));
if (testMaterial)
{
if (testMaterial.HasProperty(materialProperty))
{
testMaterial.SetTexture(materialProperty, debugTexture);
}
else
{
Debug.Log("Test material doesn't have propoerty "+materialProperty);
}
}
if (vfxOutput)
{
if (!vfxOutput.HasTexture(vfxProperty))
{
Debug.LogError(string.Format("Vfx Output doesn't have property {0}", vfxProperty));
}
else
{
vfxOutput.SetTexture(vfxProperty, debugTexture);
}
}
}
// number of groups for a dispatch with totalThreads and groups of size
// numThreadsForDim
int numGroups(int totalThreads, int groupSize)
{
// return (totalThreads + (groupSize - 1)) / groupSize;
return (totalThreads) / groupSize;
}
// Update is called once per frame
void Update()
{
if (createTexture)
{
createTexture = false;
CreateTexture();
}
if (updateTexture)
{
updateTexture = false;
UpdateTexture();
}
}
}