UnityのShaderのことはじめ_#001_Shaderの種類、Shaderでアニメーションを作る!
今回の主題は2つです。
- Shaderの種類
- Shaderでアニメーションを作成
の二つの内容です。
Shaderの種類
Shaderには
- サーフェイスシェーダ(Surface Shader)
- 頂点 / フラグメントシェーダ(Vertex / Fragment Shader)
- 固定関数シェーダ(Fixed Function Shader)
と3種類ある。
サーフェイスシェーダ(Surface Shader)
言語:Cg/HLSL
ライティングなどをUnity側でよしなにしてくれるタイプのシェーダ
この
ブログでは、今のところこれをメインに書こうと思っています。
頂点 / フラグメントシェーダ(Vertex / Fragment Shader)
言語:Cg/HLSL
頂点シェーダ/フラグメントシェーダは、普通のプログラマブルシェーダです。
これも触れるのかな?
固定関数シェーダ(Fixed Function Shader)
言語:ShaderLab
シェーダをサポートしていない端末の場合に利用されるもので、基本は使わないものらしい?
以上
Shaderでアニメーションを作成
実は、前回のっけたコードはアニメーションつきでして!
その説明を詳しくしていこうと思います。
アニメーションを作るには!
ずばり「_Time.x」を使えばいい!!
ちなみに
- _Time.x:t/20[秒]
- _Time.y:t[秒]
- _Time.z:2×t[秒]
- _Time.w:3×t[秒]
だったりします。
早速うごかす!
ソース
Shader "Example/Shader_ani" {
Properties{
_DiffuseColor("Diffuse Color",Color)=(0.0,0.0,1.0)
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert vertex:vert
struct Input {
float4 color : COLOR;
float3 viewDir;
};
float4 _DiffuseColor;
void vert (inout appdata_full v) {
v.vertex.x +=v.normal.x * -sin((v.vertex.y+_Time.w) * 3.14);
v.vertex.z +=v.normal.x * -sin((v.vertex.y) * 3.14);
}
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = _DiffuseColor;
}
ENDCG
}
Fallback "Diffuse"
}
UnityのShaderのことはじめ_#000_Shaderを書く方法
UnityのShaderのことはじめについて
UnityのShaderについて、ど素人?の僕が一からShaderを調べて書いていこうと思う趣旨の記事です。
個人的にグラフィックススキル
- 大学の学部生の時に、openFrameworksを半年間書いていたことがある。
- 学部の頃の授業で一度だけOpenGLを触った!
- エンジンは忘れたが、3Dシミュレーションのマイナーなフレームワークでコーディングした経験がある。
- 学部2年の時、4年のゼミに混じって『ゲームプログラミングのための3Dグラフィックス数学』という書籍を読んでいた。
- 補足:大学は学部・院(非情報系、研究でPCはLatexしか使っていない!)
なぜ、Shaderを?
数式で細かく、図形を弄りたいから!
ということで、身近に使っている。Unityからできるものはないかと思いShaderを始めました。
Shaderを動かしてみよう!
Shaderの動かし方は簡単!
- Unityを起動する!
- プロジェクトを作る!
- Sceneを作る!(ちなみに次からが本番!)
- Projectビューの中で右クリックをし、Shaderを作成!
- 作成したShaderをダブルクリックで起動
- 適当にコード張る。ソースの内容
Shader "Custom/tic" {
Properties {
_DiffuseColor("Diffuse Color",Color)=(0.0,0.0,1.0)
}
SubShader {
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Lambert vertex:vert
struct Input {
float4 color : COLOR;
float3 viewDir;
};
float4 _DiffuseColor;
void vert (inout appdata_full v) {v.vertex.y += 3 *abs(sin(_Time.x*1000));
}
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = _DiffuseColor;
}
ENDCG
}
Fallback "Diffuse"
} - Projectビューの中で右クリックをし、Materialを作成!
- MaterialのにShaderをドラックアンドドロップ
- HierarchyビューのCreateから3D Objectで「Sphere」、「Capsule」、「Cylinder」のいずれかを作成
- Inspectorビューの「Mash Renderer」の中の「Materials」を展開し、8のMaterialをドラックアンドドロップ
-
再生以上!