Machio_Kinniku’s diary

自分の身の周りで起きているありとあらゆることを書きます。

UnityのShader基礎を完全に理解する

お久しぶりです。マチオです。

今回の記事はUnityで取り扱うShaderに関してまとめたものです。

UnityでShaderを記述する前段階。

事前に必要な知識と、Shaderって何やねん!をまとめています。

 

「今から車乗るぜ!何で動いてるか知らんけどな!」は問題ない!

「今から車作るぜ!何で動いてるか知らんけどな!」はヤバイ!

 

Shaderを書く前に、Shaderについての基礎知識と全体把握することが目的です。

 

共有の事前知識

Unityに限らない、他の3DCGなど全てに関するものです。

マテリアル,シェーダー,テクスチャの3つに関して。

  1. マテリアルとは?
    後述のシェーダーやテクスチャを保持する箱のような役割をするもの。
    基本的には「ポリゴン(サーフェイス)の表示方法を決める描画設定集」

  2. シェーダーとは?
    レンダリングに関するスクリプト。大体GPU上で動く。
    シェーダーで見た目を制御する。

  3. テクスチャとは?
    画像データのこと。ビットマップ画像。tgaやpngなど多くの形式がある。
    法線マップ(凹凸を表現)など特殊な画像として取り扱うこともあるが、基本的にはどれもただの画像データ。

~~~~以下より本編~~~~

UnityのShaderに関して

 

Unityで扱うShaderは、ShaderLabという形式に、SurfaceShader、Vertex/FragmentShader、FixedFunctionShaderなどを当てはめている。

 

ShaderLabとは

・Unity上の全てのShaderで使用されるUnity独自の書式のこと。

後述のShaderをラップする(包み込む)ように記述する。

・ShaderLabはUnityとシェーダーコードの仲立ちをするコード。

・シェーダーは入力情報がないと動かす事ができず、入力情報はUnityのGUIスクリプトから与える。この役割をShaderLabがする。

 

Shaderの種類

Unityで扱えるShaderは以下の3つ。Cg/HLSLについては後述。

(こいつらをShaderLabで包み込む)

 

  1. Surface Shader(サーフェイスシェーダー)
    UnityのLightingやShadowが適用されるShader。材質の表現に特化している。
    ShaderLabとCg/HLSLで記述する。
    わりと楽らしい。初心者向け?(偏見)

  2. Vertex and Fragment Shader(頂点/フラグメントシェーダー)
    ※"フラグメントシェーダー"は"ピクセルシェーダー"とも呼ばれる
    ※頂点シェーダーとフラグメントシェーダーは多少異なるものだが、まとめてます
    UnityのLightingを適用させたくない場合、Surface Shaderよりも特殊な事をしたい場合のShader。
    これにLightingを適用させたい場合は独自で記述する必要があるらしい。
    ShaderLabとCg/HLSLで記述する。
    わりと難しいらしい。中級者向け?(偏見)

  3. Fixed Function Shader(固定関数シェーダー)
    Shaderをサポートしていない古いハードでアプリを動作させる際に使用されることが多い。
    ShaderLabで記述する。
    ※"固定関数シェーダー"と"固定機能シェーダー"という名前を見た。誤字なのか別モノなのかは不明。助けて。

↑上記に追加してShaderLabのSet Texture combineを使った記法もある。

※固定関数シェーダーを使用する機会は非常に少ない為、残り2つを使用することが多い。
※CgとHLSLという言語が使用されるが、ほぼイコールの為、まとめてHLSLと言ったりする。

※Image Effect Shaderという最終出力されるカメラやテクスチャ画像に適用するShaderもある。ポストエフェクトと呼んだりする。中身は頂点/フラグメントシェーダーと同じ。
※Unityで使用されるShaderLabはCg/HLSL言語の為、GLSL等の言語は書き換える必要がある。

 

どのShaderを使うのか

・Shaderがサポートされない古いハードをサポートする場合・・・固定関数シェーダー

 

・UnityにLightingを任せる場合(Unityのライティングパイプライン下、Lightの影響を受ける)・・・サーフェイスシェーダー

 

・独自のものでLighting適用されると困る場合・・・頂点/フラグメントシェーダー

 

Shader何で作るか

アセットだったり、Unity付属の機能だったり。

 

・ShaderForge(サポート終了しているが無料)

→頂点/フラグメントシェーダーが弄れる(要確認)

 

・ShaderGraph(Unity2018.2?から使える)

→色々作れるが、目で読めるコードとして出力できない?(要確認)

 

・Amplify Shader Editor(有料で優良らしい)

→サーフェイスシェーダーが弄れるらしい(要確認)

 

終わりに

この記事を読んでもShaderは書けない!!!!

しかし、Unityで扱うShaderの整理は何となくつくはずです。多分。

誤りがある可能性もあるので、気になった点はバンバン調べていきましょう。

 

TwitterなどのSNSで見るバッキバキにカッコいいShaderは、glslsandboxなどといったサイトでGLSLで記述されている物が多い印象です。

そのGLSLで記述されているものをUnityへ持ち込む為に、HLSLに書き換えて使っている事例をよく見たりします。

追記:ShaderLabで挟み込むってどういうこと?に関しては、参考記事にリンクがある凹みさんの記事が非常に分かりやすかったです。凹みさんを崇めよ。

 

参考記事一覧

その1 UnityにおけるShaderとは?

その2 ShaderLabでUnityシェーダの下地作り

説明しよう!シェーダーとはッ! - o_healerのブログ

説明しよう!マテリアルとはッ! - o_healerのブログ

開発のための言語や環境と資料:超速Unityシェーダ入門(2) – NEAREAL

しっかり学ぶシェーダプログラミング【シェーダをさわる前に編】 - Qiita

Unity のシェーダの基礎を勉強してみたのでやる気出してまとめてみた - 凹みTips

その他色々見たけど頭から吹き飛びました。すみません。