夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

UnityでShaderを勉強する その① Shaderとは何か?どんなことができるか?

本日はShader勉強枠です。

 Shaderは3Dオブジェクトの表現において非常に大切なものですが、Unity自体やC#などと違い初心者向けの情報が少なく手を出しにくいのが現状です。

 今回からShader枠として0からShaderを勉強していきます。

〇Shaderとは?

 Shader(シェーダー)とは一言でいうと『3Dオブジェクトを描画するためのプログラム』です。

 Unity内に存在するすべての3Dオブジェクトは[Shader]によって3Dオブジェクトとして描画されて[scene]ウィンドウや[Game]ウィンドウで見ることができます。

 例えばUnityの[Hierarchy]ウィンドウで右クリックから[Create→3DObject→Cube]を選択してUnityPrimitive3Dオブジェクトのキューブを作成します。

docs.unity3d.com

f:id:Holomoto-Sumire:20200323173110j:plain

 この時なにもShaderなど設定していませんがすでに白いキューブが生み出されます。

 Shaderを書くこともなくキューブが描画されていますが、[Inspector]ウィンドウを見てみるとすでに[DefaultMaterial]という名のマテリアルがアタッチされており、[Standard]というShaderが適応されています。

 f:id:Holomoto-Sumire:20200323173807j:plain

Unityでは特に意識しなくてもマテリアルに紐づく形でShaderが適応されるようになっています。

〇MaterialとShaderの違い

 UnityではShaderはマテリアルに紐づくと書きましたが、その二つの関係を見ていきます。

・Shader

   オブジェクトを描画するためのプログラム。ガラス、プラスティックといった半透明な透過率や色、発光、反射といった見え方だけではなく、メッシュを操作し本来のメッシュとは違う見た目に変化させることもできます。

・マテリアル

   Shaderから提供されるパラメータを扱ったり、Shaderのパラメータにテクスチャを与えて描画をさせるなど描画設定の集まりのことを指します。

   マテリアルの中でテクスチャやShaderを扱います。

・テクスチャ

   色や模様などを表現する画像です。

   模様だけではなくShaderの機能を用いることでNormalMapと言い凸凹を再現するテクスチャや、テクスチャに基づいて一部を発光させる、金属感を持たせるなど様々な表現が可能になります。

〇Shaderでできること

Shaderを用いるとデバイスの処理の負荷を下げつつ様々な表現が可能になります。

●画像を貼る

 f:id:Holomoto-Sumire:20200323181145j:plain  

●デコボコ感を出す。

 f:id:Holomoto-Sumire:20200323181302j:plain

●金属感を出す

f:id:Holomoto-Sumire:20200323183256j:plain

●光が当たっている場所と光が当たらない場所でテクスチャを入れ替える。

 Shaderを用いて光の当たっている場所と影の場所で昼、夜のテクスチャを分けています。

 f:id:Holomoto-Sumire:20200323182836g:plain

●アニメーション

 Shaderを用いることでUnityのスクリプトを書かずにオブジェクト自体がアニメーションを行うこともできます。

 f:id:Holomoto-Sumire:20200323185021g:plain

 また、Unityのスクリプトとは違いGPUに依存した処理で動いているためスクリプトで表現するよりもはるかに処理のコストを下げることができる場合があります。

 半面ターゲットデバイスGPUに依存しており、描画が動かない場合もあります。その場合もShaderで『動かなかった場合はこのShaderを使う』という設定ができるのでオブジェクト自体は何らかの形で描画はされることが多いです。

〇Shaderを作成する

 Unityの[Project]ウィンドウを右クリックして[Create]→[Shader]→[Standard Surface Shader]を選択しShaderを作成します。

f:id:Holomoto-Sumire:20200321215212j:plain

 作成したShaderをダブルクリックすることでC#などのスクリプトと同様にIDEが開きます。(デフォルトではVisualStudio)

 Unityのスクリプトとは違いShaderLabと呼ばれる別の言語で記述します。

 Unityのレファレンスでサンプルが公開されているので次回以降実際に記述します。

docs.unity3d.com