84 lines
2.2 KiB
C#
84 lines
2.2 KiB
C#
using UnityEngine;
|
|
|
|
public class ComputeController : MonoBehaviour
|
|
{
|
|
[Header("Connections")]
|
|
[SerializeField] private ComputeShader _computeShader;
|
|
[SerializeField] private Texture2D _inputTexture;
|
|
[SerializeField] private RenderTexture _resultTexture;
|
|
[SerializeField] private Material _resultMaterial;
|
|
|
|
[Header("State")]
|
|
[SerializeField] private int _width;
|
|
[SerializeField] private int _height;
|
|
[SerializeField] private float _sin;
|
|
|
|
private int _kernelHandle;
|
|
private const int NumThreadX = 8;
|
|
private const int NumThreadY = 8;
|
|
|
|
#region ShaderVariables
|
|
|
|
private static readonly int Result = Shader.PropertyToID("result");
|
|
private static readonly int SourceTexture = Shader.PropertyToID("source_texture");
|
|
private static readonly int SinScaled = Shader.PropertyToID("sin_scaled");
|
|
private static readonly int MainTex = Shader.PropertyToID("_MainTex");
|
|
|
|
#endregion
|
|
|
|
#region Start
|
|
|
|
private void OnEnable()
|
|
{
|
|
InitializeTextures();
|
|
|
|
InitializeShader();
|
|
|
|
RunComputeShader();
|
|
}
|
|
|
|
private void InitializeTextures()
|
|
{
|
|
_width = _inputTexture.width;
|
|
_height = _inputTexture.height;
|
|
_resultTexture = new(_width, _height, 24);
|
|
_resultTexture.name = "ResultTexture";
|
|
_resultTexture.enableRandomWrite = true;
|
|
_resultTexture.Create();
|
|
|
|
_resultMaterial.SetTexture(MainTex, _resultTexture);
|
|
}
|
|
|
|
private void InitializeShader()
|
|
{
|
|
_kernelHandle = _computeShader.FindKernel("cs_main");
|
|
_computeShader.SetTexture(_kernelHandle, SourceTexture, _inputTexture);
|
|
_computeShader.SetTexture(_kernelHandle, Result, _resultTexture);
|
|
RunComputeShader();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Update
|
|
|
|
// private void Update()
|
|
// {
|
|
// ShaderUpdate();
|
|
//
|
|
// _resultMaterial.mainTexture = _resultTexture;
|
|
// }
|
|
|
|
private void ShaderUpdate()
|
|
{
|
|
_sin = (Mathf.Sin(Time.unscaledTime) + 1) / 2;
|
|
_computeShader.SetFloat(SinScaled, _sin);
|
|
RunComputeShader();
|
|
}
|
|
|
|
private void RunComputeShader()
|
|
{
|
|
_computeShader.Dispatch(_kernelHandle, _width / NumThreadX, _height / NumThreadY, 1);
|
|
}
|
|
|
|
#endregion
|
|
} |