🌐
【Unity】【ChatGPT】Shaderをガチャする。
前置き的な
UnityのTakahashiさんがUnityとChatGPTを組み合わせて、ShaderのコーディングをAIにやらせるプロジェクトをGitに上げておられたので、それを使わせてもらって色んなShaderを作るだけの記事です。
プロンプト(AIに対する命令文)が同じでも、同じコードが生み出されるわけではないので、一期一会というか、いわゆるガチャ的感覚でやっていきます。
その備忘録として。
Shaderの勉強の教材として。
プロジェクト
このツイートから。
使い方
かなり手軽なので、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