1. Unity Geometry Shaderの基本概念
Unity Geometry Shader は頂点を変形したり歪めたりすることでオブジェクトの形状を変えることができます。シェーダーでは、sin、cos、lerp などのいくつかの組み込み関数を使用して、これらの効果を実現できます。よく使用される関数をいくつか示します。
右!ここにはゲームを学ぶのが大好きなゼロベースの初心者が集まるゲーム開発交流会があり、ゲーム開発に携わる技術者もおり、交流や学びができます。
- sin(x): x の正弦を返します。
- cos(x): x のコサインを返します。
- lerp(a, b, t): a と b の間の補間値を返します。t の範囲は 0 から 1 です。
- Smoothstep(a, b, t): a と b の間の補間を返し、t が 0 または 1 に近い場合に平滑化効果を生成します。
- pow(x, y): x の y 乗を返します。
2. Unityジオメトリシェーダーの実装
シンプルな Unity ジオメトリ シェーダーを実装して、水の波紋エフェクトを作成しましょう。まず、水の波のサイズを制御する変数を定義し、シェーダーで sin 関数を使用して水の波の効果を実現する必要があります。コードは以下のように表示されます。
Shader "Custom/Water" {
Properties {
_WaveSize ("Wave Size", Range(0.01, 2)) = 1
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 vertex : SV_POSITION;
};
float _WaveSize;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.vertex.y += sin(v.vertex.x * _WaveSize + _Time.y * 10) * 0.1;
o.vertex.y += sin(v.vertex.z * _WaveSize + _Time.y * 10) * 0.1;
return o;
}
fixed4 frag (v2f i) : SV_Target {
return fixed4(0, 0.5, 1, 1);
}
ENDCG
}
}
}
上記のコードでは、水の波のサイズを制御するために _WaveSize 変数を定義しました。vert 関数では、sin 関数を使用して頂点を変換し、水の波の効果を実現します。frag 関数では、単純に固定色を返します。最後に、シェーダーを Water という名前のファイルとして保存します。
3. Unityジオメトリシェーダーの応用
上記のシェーダーを平面に適用し、シーンにいくつかのライトを追加して、非常にシンプルですが優れた水の波紋効果を確認できます。コードは以下のように表示されます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Water : MonoBehaviour {
public Material waterMaterial;
// Use this for initialization
void Start () {
MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
meshRenderer.material = waterMaterial;
}
// Update is called once per frame
void Update () {
}
}
上記のコードでは、Water スクリプトをプレーンに追加し、watermaterial 変数を作成したばかりの Water Shader に設定します。次に、Start 関数で MeshRenderer コンポーネントを取得し、そのマテリアルを作成したばかりのマテリアルに設定します。最後に、シーン内に単純な水の波紋エフェクトが表示されます。