夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unity上でChatGPTを使用してシェーダーを作成するAIShaderを試す。

本日はShader&AI枠です。

23年に入りChatGPTの普及が爆発的になっていますが、先日Unityのエディタ内でChatGPTを使用してシェーダーを作成するテストリポジトリが公開されました。

今回はこちらを試していきます。

〇ChatGPTとは?

ChatGPTDALL・E2Stable Diffusionを開発、提供しているOpenAIが22年末にリリースしたAIです。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

特徴として文章を入力することで自然な受け答えが行われます。

その特性としてMicrosoftではブラウザのBingにChatGPTを使用した機能を提供するなど

bingのチャット機能

またChatGPTの特徴として人間の記述したテキストを読み解いてコードを記述してくれます

このような機能を応用して先日AIShaderと呼ばれるリポジトリがUnityの高橋啓次郎さんから公開されました。

今回はこちらを試していきます。

〇AIShader

AIShaderは前述の通りUnityの高橋啓次郎さんが作成しているツールです。

github.com

バージョンはUnity2022.2.9となっているためバージョンに注意が必要です。

今回はUnity2022.2.10f1で行っていきます。

 ChatGPTをUnityで使用するためには開発者としてAPIキーを入手する必要があります。

ChatGPTのアカウントを開きます。

platform.openai.com

②アカウントを持っている場合はログイン、持っていない場合はsign-upを行います。

現時点ではAPIキーは無料の場合数か月程度の利用制限がありますので注意が必要です。

APIキーのタブを開きます。

Create new secret keyを選択しAPIキーを作成します。

AIShaderを開きます。

ProjectSettingsを開きAIShaderのタブを開きます。

APIKeyに作成したAPIキーを入力します。

Testシェーダーを選択します。

⑨インスペクターウィンドウからPromptに作成したいシェーダーの特徴を記述してGenerateボタンを押します。

これによってCachedに作成されたシェーダーが表示されます。またTestシェーダー自体にも適応されます。

今回次のような指示を記述しました。

Random color change using Unity time(ランダムに時間経過で色が変わるシェーダー)

次のようなシェーダーが作成されました。

私が想定していたよりも切り替わりが激しく目に優しくないですがきちんとランダムに時間経過で色が変わっています。

生成されたコードは次のようになります。

Shader "Custom/Unlit_RandomColorChange" {
    Properties {
        _MainColor ("Color", Color) = (1,1,1,1)
    }
    
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 100
        
        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            
            struct appdata {
                float4 vertex : POSITION;
            };
            
            struct v2f {
                float4 vertex : SV_POSITION;
            };
            
            float4 _MainColor;
            
            v2f vert (appdata v) {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target {
                float4 color = _MainColor;
                color.r += sin(_Time.y * 20.0) * 0.5 + 0.5;
                color.g += sin(_Time.z * 17.0) * 0.5 + 0.5;
                color.b += sin(_Time.x * 25.0) * 0.5 + 0.5;
                return color;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

複雑な処理を与えると生成してくれなかったり細かい融通が利かないなど問題はあるもの使い方次第ではよいアイデアや勉強のツールとなるのではないかと思いました。

本日は以上です。