ChatGPTにUnityのシェーダーを書かせる

# え？

UnityJapanチャンネルでChatGPTにシェーダーを書かせていた
https://www.youtube.com/watch?v=gPQpVgbBz58&ab_channel=UnityJapan

すげーーーーーーーーーー！！！

自分もシェーダーを書かせたい。

# ほんで？
書かせてみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100503/b69039e7-812c-cd89-049c-3f4b328636ed.png)


```
以下はUnityのUnlitシェーダーに、要求された機能を実装した例です。このシェーダーは、3秒ごとにオブジェクトの透明度を緩やかに変更し、カスタムカラープロパティからオブジェクトの色を変更できます。

Shader "Custom/Unlit with Alpha Fade"
{
    Properties
    {
        _Color("Color", Color) = (1,1,1,1)
    }
 
    SubShader
    {
        Tags {"Queue"="Transparent" "RenderType"="Opaque" }
        LOD 100
 
        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha
 
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
 
            struct appdata
            {
                float4 vertex : POSITION;
            };
 
            struct v2f
            {
                float4 pos : SV_POSITION;
                float4 color : COLOR;
            };
 
            float _Alpha = 1.0;
            float _FadeSpeed = 0.1;
 
            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = _Color;
                return o;
            }
 
            fixed4 frag(v2f i) : SV_Target
            {
                fixed4 c = i.color;
                c.a = _Alpha;
                return c;
            }
 
            ENDCG
        }
    }
 
    FallBack "Diffuse"
}
 
CustomEditor "UnityEditor.ShaderGraph.UnlitGUI"

```

# うーん...
指定した機能があんまり入ってない。
ちょっと複雑すぎたのかも。

# 再度挑戦
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100503/38732272-d4ed-5a1c-8073-21ad4ce6873b.png)

```
Shader "Custom/Unlit with Alpha Blink"
{
    Properties
    {
        _Color("Color", Color) = (1,1,1,1)
    }
 
    SubShader
    {
        Tags {"Queue"="Transparent" "RenderType"="Opaque" }
        LOD 100
 
        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha
 
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
 
            struct appdata
            {
                float4 vertex : POSITION;
            };
 
            struct v2f
            {
                float4 pos : SV_POSITION;
                float4 color : COLOR;
            };
 
            float _Alpha = 1.0;
            float _FadeSpeed = 0.1;
            float _BlinkInterval = 3.0;
            float _BlinkTimer = 0.0;
 
            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = _Color;
                return o;
            }
 
            fixed4 frag(v2f i) : SV_Target
            {
                fixed4 c = i.color;
                c.a = _Alpha;
                return c;
            }
 
            void Update()
            {
                _BlinkTimer += Time.deltaTime;
                if (_BlinkTimer > _BlinkInterval)
                {
                    _Alpha = 1.0 - _Alpha;
                    _BlinkTimer = 0.0;
                }
            }
 
            ENDCG
        }
    }
 
    FallBack "Diffuse"
}
 
CustomEditor "UnityEditor.ShaderGraph.UnlitGUI"
```

# うーん.........
途中でC#が混ざった
方向性はいいかんじだけど、時間によって変化するのが苦手なのかも

# 3度目の正直
パラメータを作らせて、時間で変化みたいなとこは自分で書けばできるかも？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100503/1b3819f4-b354-763c-cc08-8134dbd848bc.png)

```
Shader "Custom/Unlit with Custom Parameters"
{
    Properties
    {
        _Color("Color", Color) = (1,1,1,1)
        _Alpha("Alpha", Range(0, 1)) = 1
    }
 
    SubShader
    {
        Tags {"Queue"="Transparent" "RenderType"="Opaque" }
        LOD 100
 
        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha
 
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
 
            struct appdata
            {
                float4 vertex : POSITION;
            };
 
            struct v2f
            {
                float4 pos : SV_POSITION;
                float4 color : COLOR;
            };
 
            float4 _Color;
            float _Alpha;
 
            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = float4(_Color.rgb, _Alpha);
                return o;
            }
 
            fixed4 frag(v2f i) : SV_Target
            {
                return i.color;
            }
 
            ENDCG
        }
    }
 
    FallBack "Diffuse"
}
 
CustomEditor "UnityEditor.ShaderGraph.UnlitGUI"

```

# ええやん
指定通りに出力してくれた

```
o.color = float4(_Color.rgb, _Alpha * abs(_SinTime.w));
```

ここにちょっと足して...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100503/2b1c487a-3d65-f75a-0632-be215e6a0f6e.png)

できた！！！！


# ChatGPT君優秀な子やなぁ
ええ子や

# 今後も使っていきたいよーって話
自分はグラフィックばりばり担当じゃないのでシェーダーをがつがつ書くことはないけど、
なんだかんだこのぐらいのシェーダーをちょっと書きたい時とかあるから便利

今はShaderGraphばっかり使ってるけど、このスピード感で実装できるのは魅力的

この後もいろいろ試してみたけど、
時間による変化とか、条件分岐とかが入ると途端に全体がおかしくなる

単一の機能を要望して、手直ししたり、組み合わせたりするのがよさそう