🌐

【Unity】【ChatGPT】Shaderをガチャする。

2023/03/09に公開

前置き的な

UnityのTakahashiさんがUnityとChatGPTを組み合わせて、ShaderのコーディングをAIにやらせるプロジェクトをGitに上げておられたので、それを使わせてもらって色んなShaderを作るだけの記事です。

プロンプト(AIに対する命令文)が同じでも、同じコードが生み出されるわけではないので、一期一会というか、いわゆるガチャ的感覚でやっていきます。
その備忘録として。
Shaderの勉強の教材として。

プロジェクト

このツイートから。
https://twitter.com/_kzr/status/1632634562399600640

使い方

かなり手軽なので、Readmeを見ればわかります。

実際にChatGPTで作成されたコード

1.横縞々模様
プロパティ項目
・Texture
・色1
・色2
・縞の数(1≦x≦10)

Shader "Unlit/Stripe" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _StripeColor1 ("Stripe Color 1", Color) = (1,1,1,1)
        _StripeColor2 ("Stripe Color 2", Color) = (0,0,0,1)
        _StripeCount ("Stripe Count", Range(1, 10)) = 1
    }

    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _StripeCount;
            fixed4 _StripeColor1;
            fixed4 _StripeColor2;

            v2f vert (appdata v) {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target {
                float stripeWidth = floor(_StripeCount / 2.0);
                float stripeIndex = floor(i.uv.y * _StripeCount);
                float stripePattern = fmod(stripeIndex, 2.0);

                float4 stripeColor;
                if (stripePattern == 1.0) {
                    stripeColor = _StripeColor1;
                } else {
                    stripeColor = _StripeColor2;
                }

                return stripeColor;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

2.チェック柄
プロパティ項目
・Texture
・色1
・色2
・チェックの数

Shader "Unlit/Checkerboard"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color1 ("Color1", Color) = (1,1,1,1)
        _Color2 ("Color2", Color) = (0,0,0,1)
        _Size ("Size", Range(1, 50)) = 10
    }
 
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata 
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f 
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            
            sampler2D _MainTex;
            float4 _MainTex_ST;

            float4 _Color1;
            float4 _Color2;
            float _Size;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float2 uv = i.uv;
                uv *= _Size / _MainTex_ST.xy;

                float2 p = floor(uv);

                bool off = (fmod(p.x + p.y, 2.0) >= 1.0);
                
                if (off)
                    return _Color1;
                else
                    return _Color2;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

3.グラデーション
プロパティ項目
・色1
・色2
・グラデーションの比率

Shader "Unlit/Gradient" {
	Properties {
	    _MainTex ("Main Texture", 2D) = "white" {}
	    _Color1 ("Color 1", Color) = (1,1,1,1)
	    _Color2 ("Color 2", Color) = (0,0,0,1)
	    _Ratio ("Gradient Ratio", Range(0.0,1.0)) = 0.5
	}

	SubShader {
		Tags {"Queue"="Transparent" "RenderType"="Opaque"}

		Pass {
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct appdata {
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f {
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			float4 _Color1, _Color2;
			float _Ratio;
         
			v2f vert (appdata v) {
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}

			fixed4 frag (v2f i) : SV_Target {
				float4 color = lerp(_Color1, _Color2, i.uv.y / _Ratio);
				return color;
			}
			ENDCG
		}
	}
	FallBack "Diffuse"
}

4.縞スクロール
プロパティ項目
・色1
・色2
・スクロール速度
・縞の幅

Shader "Custom/UnlitStripe" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _StripeColor1 ("First Color", Color) = (1, 1, 1, 1)
        _StripeColor2 ("Second Color", Color) = (0, 0, 0, 0)
        _ScrollSpeed ("Scroll Speed", Range (0.0, 1.0)) = 0.5
        _StripeWidth ("Stripe Width", Range (0.01, 0.9)) = 0.1
    }
    SubShader {
        Tags {"Queue"="Transparent" "RenderType"="Opaque"}
        LOD 100

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            struct appdata {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
            struct v2f {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            sampler2D _MainTex;
            float _StripeWidth;
            float _ScrollSpeed;
            float4 _StripeColor1;
            float4 _StripeColor2;
            v2f vert (appdata v) {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }
            fixed4 frag (v2f i) : SV_Target {
                float2 p = i.uv;
                p.x = fmod(_Time.y * _ScrollSpeed + p.x, _StripeWidth);
                return lerp(_StripeColor1, _StripeColor2, smoothstep(0.45, 0.55, p.x));
            }
            ENDCG
        }
    }
    FallBack Off
}

5.グラデーションスクロール
プロパティ項目
・色1
・色2
・スクロール幅

Shader "Unlit/Spiral" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _Color1 ("Color 1", Color) = (1,1,1,1)
        _Color2 ("Color 2", Color) = (0,0,0,1)
        _Speed ("Speed", Range(0, 1)) = 0.5
    }
 
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 100
 
        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
 
            #include "UnityCG.cginc"
 
            struct appdata {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
 
            struct v2f {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                float4 color : COLOR;
            };
 
            sampler2D _MainTex;
            float4 _Color1;
            float4 _Color2;
            float _Speed;
 
            v2f vert (appdata v) {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }
 
            fixed4 frag (v2f i) : SV_Target {
                float angle = i.uv.x * 10 * 3.14159 * _Speed + _Time.y * 2 * 3.14159;
                float2 spiral = float2(cos(angle), sin(angle));
                float4 c = lerp(_Color1, _Color2, spiral.y * 0.5 + 0.5);
                return c;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

Discussion