UnityのShaderの解説と使い方まとめました
19/02/03 15:52:20 19/02/17 20:03:38
Shaderとは、Unityの描画演出のための機能です。Unityを使っていればオブジェクトを描画してデザインを作りますが、その際にも必ずShaderの機能を使用しています。特別Shaderを使っている意識はないかもしれませんが、意識していない場合デフォルトのStandard Shaderが設定されているはずです。
このように何も考えずとも勝手に使われているShaderですが、意識的に使いこなすことでより効率的にクオリティの高い描画演出を作り出すことができます。このページでは、Shaderの種類や使い方について解説していきます。
Shaderの仕組み
ShaderのなかでもStandardは万能に使いやすい、トゥーンShaderはアニメ調の描画演出に最適、といった特徴があります。個々のShaderの特徴や使い方を見ていくことは重要なのですが、その前にざっくりとShader全般の仕組みを知っておくのがおすすめです。
Shaderそのものについてある程度詳しく知っておくことで、Shader選びや使い方が効率的になるからです。逆に、Shaderで何ができるのかなんとなくはわかっているけれど曖昧な部分が多い、できることがよくわからない、といった状況だと適当に選んで操作することになります。
適当にやっていても上達はしますが、枠組みだけはきちんと理解しておいた方が上達が速くなるということです。
Shaderは3Dモデルで三角形の集合体
まずShaderは上で説明した通り描画演出のためのツールで、主に3Dで使います。そして、3Dというのは三角形の集合体です。これについては3Dについて調べてたことのある方はご存じでしょう。
3Dが三角形の集合体なのはShaderというよりは3Dの概要になるので、詳しいことに興味のある方はぜひ調べてみてください。とりあえずShaderは三角形で構成される3Dで、三角形を操作していくイメージが重要になります。
三角形をどう処理するのか
次に、その三角形をどのように処理すれば良いのかという話です。その流れを大まかに記述すると以下のようになります。
- 三角形の頂点情報を加工する(頂点シェーダー)
- ピクセル情報を加工する(フラグメントシェーダー)
- 画面へ描画する
以上のような流れで三角形が最終的に画面に描画される演出に変わります。
マテリアルを作る
Shaderは上記の通り描画演出のためのツールですが、これはマテリアルに対して使用します。マテリアルとは、Unityにおいてオブジェクトを決定する要素です。オブジェクトを作るのがマテリアルで、Shaderはマテリアルを演出する機能です。
用語が多くてややこしいのですが、イメージとしては机というオブジェクトがあって、マテリアルは木材、Shaderは木材に対して行う加工のようなイメージです。マテリアルの具体的な使い方は以下のようになります。
「Project上で右クリック」→「Create」→「Material」
これでマテリアルが作れます。作ったマテリアルはオブジェクトの上にドラッグ&ドロップすることで、設定できます。
Shaderを作る
オブジェクトを作ってマテリアルを設定したら、次にShaderを作ります。Shaderファイルの作り方は以下の流れです。
「Projectウィンドウ上で右クリック」→「Shader」→「Unlit Shader」
これでひとまずShaderができます。このShaderをマテリアルにドラッグ&ドロップすることで設定できます。オブジェクトに対してマテリアルを設定し、さらにそのマテリアルに対してShaderを設定します。
慣れない用語のものを重ねるのでややこしいように思えるかもしれませんが、実際にやってみるとそれぞれの役割がわかるり、またドラッグ&ドロップで重ねる感覚も案外直感的に理解しやすいです。
なぜなら、マテリアルがオブジェクトに対する設定で、Shaderがマテリアルに対する設定、ということがやってみるとわかるからです。
Shaderスクリプトの記述
Shaderファイルをダブルクリックすると、スクリプトを編集するためのエディタが開けます。Shaderのスクリプトを書くための言語をShaderLabといい、構造としてはC#に似ています。
Unityのための言語をわざわざ練習するのはスキル的に効率的でない、と思われるかもしれませんが、C#をはじめ他の言語にも応用が利くので練習する価値があります。具体的にどのような言語なのかイメージするため、以下のサンプルコードを紹介します。
// シェーダーの情報
Shader "Unlit/MyShader"
{
// Unity上でやり取りをするプロパティ情報
// マテリアルのInspectorウィンドウ上に表示され、スクリプト上からも設定できる
Properties
{
_Color ("Main Color", Color) = (1,1,1,1) // Color プロパティ (デフォルトは白) a____
}
// サブシェーダー
SubShader
{
Pass
{
CGPROGRAM // プログラム開始の宣言
// 関数宣言
#pragma vertex vert
#pragma fragment frag
// 変数宣言
fixed4 _Color; // マテリアルからのカラー a____
// 頂点シェーダー
float4 vert (float4 vertex : POSITION) : SV_POSITION
{
return UnityObjectToClipPos(vertex);
}
// フラグメントシェーダー
fixed4 frag () : SV_Target
{
return _Color; a____
}
ENDCG // プログラム終了の宣言
}
}
}
各種プロパティの記述を行います。上の例だと白の円ができます。たとえば色の設定はShaderの記述で設定しても良いですが、マテリアルのGUIで設定することも可能です。両方から設定した場合、上位であるマテリアルの設定が優先される仕様になっています。
イメージをつかむことが重要なので最初からコードの意味を理解する必要はないのですが、ある程度細分化すると上記のソースコードでは以下の設定を行っています。
・プロパティ情報
Unityから情報を取得するために定義
・関数宣言
シェーダー処理で呼ぶ関数を指定
・変数宣言
Unityからデータをうけとるなどの目的のため変数を定義
・頂点シェーダー
頂点シェーダーの処理
・フラグメントシェーダー
フラグメントシェーダーの処理
まとめ
Shaderの定義やオブジェクトやマテリアルとの関係、スクリプトの基本的な書き方を見てきました。細部の知識から入るよりは、まずは大枠をつかむことをおすすめします。大枠を把握したうえでGUIやスクリプトをいじっていれば、Shaderの役割を理解したうえで具体的に自分のゲームにどう活かすかが見えてきます。
全体のなかで今自分が何をやっているのか把握することと、細部の個々の処理に慣れることの両方が必要です。あとは、Unityを含めゲーム開発ではGUIでの設定とプログラミングする部分が混在するので、その切り分けが最初は難しいかもしれません。
イメージとしては、プログラミングではほぼすべての処理を実現することが可能で、使える部分はGUIを使っていくといった感じです。そしていろいろいじっているとGUIでの設定とプログラミングでの設定が重複することがありますが、上位の設定が優先されます。
なので、全体的に見ればGUIからの設定が優先されるケースが多いです。
【Unity関連記事】
▼Unityの基礎編
・ 【unityのフリーランス求人・案件情報】エンジニア需要や開発単価、未経験でもいける?
・ 【unity入門】ゲーム開発だけじゃない、Unityで出来ること
▼Unityの外部アセット、リソース編
・ UnityでMMDモデルを自由自在に動かしてみよう!
・ Unity adsを使って簡単に広告を導入しよう
・ Unityのアセットストアの上手な使い方
・ Unityで作られているARアプリをまとめてみました
▼Unityのコンポーネント編
・ Unityのrigidbodyを使って物理演算を導入してみよう
・ コードを使わずにUnityでキャラ追従のカメラを作る方法
・ Unityで簡単にアニメーションを作成する方法をまとめました
・ Unityでオブジェクトを回転させる方法をわかりやすくまとめました
・ Unityのtransformを使ってオブジェクトの座標や回転を操作する
・ Unityのアニメーターを簡単に作成する方法まとめ
・ (この記事)UnityのShaderの解説と使い方まとめました
・ Unityで「当たり判定」(衝突判定)を付ける方法
・ Unityのgetcomponentの上手な使い方と使用時の注意点まとめ
・ Unityでキャラの移動を制御する方法まとめ
・ Unityのraycastを使って出来ることをまとめました
▼Unityのデフォルト機能、ゲーム製作編
・ blenderで作ったオブジェクトをUnityで組み込んでみよう
・ Unityのコルーチンとは?使い方をまとめました
・ Unityで作られているRPGゲームを作るための6つのステップ
・ Unityのパーティクルを使って演出できるエフェクト例
・ UnityでのUIデザインの基礎をまとめてみました
・ Unityのcloud buildの便利な点をまとめました
・ Unityを使って半日でFPSゲームを作ってみよう
人気記事