【Unity】ChatGPTを使ってカスタムポストプロセスで画面全体にノイズを入れる

投稿者: | 2023-06-16

ChatGPTを活用して、画面全体にノイズを入れるポストプロセッシングエフェクトを作ってみました。

カスタムエフェクト

独自のポストプロセッシングエフェクトには、「C# Custom Post Process」と「FullScreen Shader」の2つのファイルが必要です。ノイズの動きはFullScreen Shaderに書き、C# Custom Post Processでマテリアルの作成、描画、削除を行います。

Unityマニュアルにサンプルコードがあるので、それをChatGPTに渡して指示通りに書き換えてもらうことで簡単に作成しました。

https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@12.1/manual/Custom-Post-Process.html

C# Custom Post Process

まずC#スクリプトを作って、サンプルコードをコピペします。スクリプトの名前とクラス名は一致させます。HDRPのバージョンによってサンプルコードが少し違うようです。

FullScreen Shader

新規シェーダーを作って、マニュアルの2つ目のサンプルコードをコピペします。

プロジェクト設定

Project Settingsで、HDRP Global Settingsの「After Post Process」にカスタムポストプロセスを追加します。

Volumeコンポーネント

ヒエラルキーでGlobal Volumeを作成します。

Global Volumeのインスペクタで「New」ボタンを押して、新しいボリュームプロファイルを作ります。

「Add Override」ボタンをクリックして、新しく作ったカスタムエフェクトをクリックします。検索窓やメニューが使えます。

グレースケールのオーバーライドが表示されるので、「All」を押します。

これでIntensityのスライダーが操作できるようになります。

この変数は作成したCustomPostProcessVolumeComponentの派生クラスで定義され、Renderメソッド中でシェーダーのプロパティにセットされます。

public sealed class GrayScale : CustomPostProcessVolumeComponent, IPostProcessComponent
{
    [Tooltip("Controls the intensity of the effect.")]
    public ClampedFloatParameter intensity = new ClampedFloatParameter(0f, 0f, 1f);

    // ...

    public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination)
    {
        // ...

        m_Material.SetFloat("_Intensity", intensity.value);

        // ...
    }

_Intensityプロパティは作成したシェーダーで、元の色とグレースケールを補間する値として使用されています。

    float _Intensity;
    // ...

    float4 CustomPostProcess(Varyings input) : SV_Target
    {
        // ...

        // Apply greyscale effect
        float3 color = lerp(sourceColor, Luminance(sourceColor), _Intensity);

        return float4(color, 1);
    }
Intensity: 0
Intensity: 1

ChatGPTで修正する

これはIntensityの値に比例して画面全体がグレースケールになるシェーダーですが、このシェーダーコードとノイズ等の詳細をChatGPTに入力します。

エラーはそのまま入力すると修正コードが得られます。

パーリンノイズ
値ノイズ
三角関数

スライダーを追加する

_Intensityと同様にシェーダーコードにプロパティを追加します。

    float _Intensity;
    float _Frequency;
    float _Amplitude;

    // ...

    float4 CustomPostProcess(Varyings input) : SV_Target
    {
        // ...
    
        float offset = _Amplitude * sin(_Time.x * _Frequency * input.texcoord.y) * _Intensity;

        // ...
    }

CustomPostProcessVolumeComponentの派生クラスで、これらのプロパティに値をセットします。

    public ClampedFloatParameter intensity = new ClampedFloatParameter(0f, 0f, 1f);
    public ClampedFloatParameter frequency = new ClampedFloatParameter(50f, 0.1f, 400);
    public ClampedFloatParameter amplitude = new ClampedFloatParameter(0.1f, 0f, 0.5f);

    // ...

    public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination)
    {
        // ...

        m_Material.SetFloat("_Intensity", intensity.value);
        m_Material.SetFloat("_Frequency", frequency.value);
        m_Material.SetFloat("_Amplitude", amplitude.value);

        // ...
    }

Volumeコンポーネントにスライダーが表示され、ノイズを制御できます。

これで、簡単に画面にノイズを入れられました。

コメントを残す

メールアドレスが公開されることはありません。