コンテンツにスキップ

ComputeShader

実装例

sample.compute
// Each #kernel tells which function to compile; you can have many kernels
#pragma kernel CSMain

// Create a RenderTexture with enableRandomWrite flag and set it
// with cs.SetTexture
RWTexture2D<float4> Result;
Texture2D<float4> Src;

float Radius;

[numthreads(8, 8, 1)]
void CSMain(uint3 id : SV_DispatchThreadID)
{
    float4 col = Src[id.xy];

    Result[id.xy] = (Radius > 40) ? col.rgba : ((Radius > 30) ? col.bgra : (Radius > 20) ? col.grba : (Radius > 10) ?
    col.brga : col.rbga);

    //Result[id.xy] = col.grba;
    //Result[id.xy] = col.rbga;

    //Result[id.xy] = float4(id.x & id.y, (id.x & 15) / 15.0, (id.y & 15) / 15.0, 0.0);
}
sample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ComputeImage : MonoBehaviour {
    private const string K_MAIN = "CSMain";

    [SerializeField]
    UnityEngine.UI.RawImage image;
    [SerializeField]
    ComputeShader computeImage;
    [Range(0f, 50f)]
    public float Radius = 0.0f;

    private RenderTexture m_rTexture;
    private int m_kernel;

    private void Awake() {
        m_kernel = computeImage.FindKernel(K_MAIN);
    }
    private void OnEnable() {
        //  init rtexture
        m_rTexture = new RenderTexture(Camera.main.pixelWidth, Camera.main.pixelHeight, 0);
        m_rTexture.enableRandomWrite = true;
        m_rTexture.Create();
        image.texture = m_rTexture;

        //  set params
        computeImage.SetTexture(m_kernel, "Result", m_rTexture);
    }
    private void OnDisable() {
        m_rTexture.Release();
    }
    private void OnRenderImage(RenderTexture source, RenderTexture destination) {
        //  update params
        computeImage.SetTexture(m_kernel, "Result", m_rTexture);
        computeImage.SetTexture(m_kernel, "Src", source);
        computeImage.SetFloat("Radius", Radius);

        //  run
        computeImage.GetKernelThreadGroupSizes(m_kernel, out uint x, out uint y, out uint z);
        computeImage.Dispatch(m_kernel, (int)(Camera.main.pixelWidth), (int)(Camera.main.pixelHeight), 1);

        Graphics.Blit(m_rTexture, destination);
    }
}

Extensions

Reference


最終更新日: August 14, 2023
作成日: August 14, 2023