Unity シェーダーを学ぶ

【Unity Shader入門①】ShaderLabとShader Graphの基礎を解説!【初心者向け】

Unityでリアルな光の表現や特殊な視覚効果を実現したいときに欠かせないのが「Shader(シェーダー)」の知識です。

本記事では、Shaderの基本から、UnityにおけるShaderの種類、レンダーパイプラインごとの違い、Shader GraphとShaderLabの選び方まで、初心者にもわかりやすく整理して解説します。

Shaderってなんか難しそう…という方も、まずはざっくりと「何ができるのか」を知るところから始めましょう!

 

UnityのShaderとは?基礎から役割までわかりやすく解説

Shaderは頂点情報やテクスチャデータをもとにして、オブジェクトの色を計算する、GPUで動作するプログラムです。

GPUで動作するので、CPUと並列処理ができるので、高速かつ複雑な描画が可能になります。

UnityにおけるShaderの詳細については、下記の動画で、これ以上にないくらいわかりやすく説明してくれています。

 

Shaderは何をしている?描画処理における役割を解説

Shaderは、モデルの表面に光がどのように当たり、どのように反射・屈折するかを制御します。

これにより、マテリアルの質感、透明感、影の付き方などを表現可能となります。

ビジュアル表現において中核を担う存在です。

 

UnityにおけるShaderの特徴

UnityにおけるShaderは、ShaderLabという独自構文により記述されます。また、近年はShader Graphがサポートされ、視覚的にシェーダーを実装することもできるようになりました。

Shader Graphが実装されたことでエンジニアだけではなく、デザイナーなどのシェーダー作成に慣れていないユーザーがShaderを作成・修正できるようになります。

 

Unityで使えるShaderの種類と違い

Shaderの種類や記述方法を理解するには、それが動作する「レンダーパイプライン」の仕組みを把握する必要があります。

各レンダーパイプラインは、それぞれ異なるShaderの動作環境と制約を持っており、どのパイプラインを使用するかによって、Shaderの書き方や使える機能が大きく変わるためです。

 

Unityで提供されている3つのレンダーパイプライン

Unityでは以下の3つのレンダーパイプラインが提供されています。

URP、HDPRに関しては下記動画も参考になります。

Built-in Render Pipeline(BRP)

標準的な描画パイプラインです。

柔軟でカスタムShaderとの相性が良く、レガシーなプロジェクトや学習目的に多く使用されています。

昔からあるレンダーパイプラインなので、Asset Storeで販売・配布されているアセットで、動作確認済みになっているものも多くあります。

ShaderLabとHLSLを併用して記述でき、自由度の高い表現が可能です。

ただし、今後のUnityアップデートにおいて非推奨となる可能性があり、長期的にはURP、HDRPへの移行が推奨されるでしょう。

 

Universal Render Pipeline(URP)

軽量かつ高速で、モバイルからPCまで幅広いプラットフォームに対応する汎用的なSRP(Scriptable Render Pipeline)の一つです。

Shader Graphと密接に連携しており、パフォーマンスと開発効率のバランスが優れています。

また、LitシェーダーやUnlitシェーダなどの、あらかじめ用意されたマテリアルテンプレートを拡張して使用します。

HLSLでの独自実装も可能ですが、URP向けの記述ルールに従う必要があります。

個人的にはどのレンダーパイプラインがいいのか?と迷ったら、まずはURPを選んでおいていいと思ってます。

 

High Definition Render Pipeline(HDRP)

高品質なライティングやポストエフェクトを必要とするプロジェクト向けに設計されたSRP(Scriptable Render Pipeline)の一つです。

リアルタイムなグローバルイルミネーションやボリューメトリックライティングなど、高度な描画機能が搭載されてます。

Shader GraphやHLSLによる詳細な制御が可能です。

ただし、HDRP特有のライティングモデルやエフェクト(例:Volumetric Fog、Screen Space Reflections)に対応したShader構築が求められます。

Shader GraphのノードもHDRP専用のものが含まれており、互換性の観点からBuilt-inやURPのShaderはそのままでは利用できません。

HLSLでの記述も、HDRPのフレームワークに適合するよう慎重な設計が必要です。

 

Unlit ShaderとLit Shaderの使い分け

UnityにおけるShaderは、大きく分けてライト(光源)に依存するものと、しないものに分類されます。

この区別は、描画表現の根幹に関わる重大な違いです。

Unlit Shader は「ライト非依存型」で、光の影響を一切受けず、指定した色・テクスチャ・エフェクトを常に一定の見た目で描画します。

影も反射もありません。まるで「紙に描いたような」質感になります。

一方、Lit Shader は「ライト依存型」で、シーン内の光源の位置や種類に応じて、影やハイライト、反射、環境光の影響をリアルタイムに受けて描画されます。

この違いは、見た目だけでなくパフォーマンスや適用領域にも大きく関係します。

パフォーマンス・表現力・用途の比較

比較項目 Unlit Shader Lit Shader
ライトの影響 受けない 受ける
パフォーマンス 軽量で高速 ライト計算があり重め
見た目の柔軟性 制御しやすいが簡素 リアルな質感を実装可能
主な用途 UI、2D、エフェクト キャラクター、背景、リアルな物理表現

 

URPやHDRPでの適用場面

超ざっくり使い分けを考えるなら、Unlit Shaderは「常に同じ表現をしたい」用途に向き、Lit Shaderは「環境に応じたリアルな質感を出したい」用途に向いています。

URPでは、Unlit Shader GraphおよびLit Shader Graphがそれぞれ提供されています。

UnlitはUI・アイコン・ビルボードなどに、LitはPBR表現に対応したマテリアル制作に活用されます。

HDRPでは、Lit系ShaderがデフォルトでPBR・SSS・コート・屈折などに対応しており、Unlitの使用は限られます(パーティクル、UI等)。

選択基準は「表現したいものが環境に応じて変化すべきか」に尽きます。

 

Surface ShaderはURP、HDRPで使えない

Surface Shaderは、簡易にライティング付きのShaderを記述可能でしたが、SRP(Scriptable Render Pipeline)では使用できません。

現在SRPが主流になっていることを考えると、Surface Shaderを学ぶ優先度は下げてもいいでしょう。

 

Shader Graphとは何か?

Shader Graphについて公式マニュアルはこちら

 

ノードベースの視覚的シェーダー編集ツール

簡単にいうとShader Graphは、ノードを線で繋ぐことで視覚的にShaderを構築可能なUnity公式ツールです。

視覚的操作によって、Shaderの構造を直感的に理解しやすくなります。

 

プログラミング不要で構築できる表現例

表現例については、これまた公式からさまざまなコンテンツが挙げられています。

例えば下記動画では、ディゾルバエフェクト、パワーゲージ、古風なテレビ画面が紹介されています。

また下記動画では、エネルギーシールドとトルネードが紹介されています。

そして下記では2Dのエフェクトとして、ワープエフェクトを色の変更、帯電表現、ブレる動き、スキャンライン、ボーダーラインの組み合わせで表現しています。

こんな感じで2Dのスプライトアニメーションに対しての輪郭線シェーダーも作れます。

 

結構、公式だけでも色々な表現を出してくれているので、参考になりますね。

 

ShaderLabとは何か?

ShaderLabとは、Unity独自のShaderを定義するフレームワークみたいなものです。

昔のOpenGL系だと頂点シェーダーとフラグメントシェーダーを別々のファイルに分けて管理するのが一般的だったのですが、ShaderLabでは一つにまとめて作れるようになっています。

「Unityにシェーダーをどう使ってほしいか」を指示するスクリプト構造で、超簡単に構造を書くと下記のようになります。

Shader "Custom/Simple"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float4 vert(float4 vertex : POSITION) : SV_POSITION
            {
                return UnityObjectToClipPos(vertex);
            }

            fixed4 frag() : SV_Target
            {
                return fixed4(1,0,0,1); // 赤色
            }
            ENDCG
        }
    }
}

実際のシェーダー処理はCgやHLSLによって記載されます。

CgとHLSLはどう違うの?と思うかもしれませんが、概ね同じで、とりあえずHLSLだけ学んでおけばOKというのが私の認識です。

HLSLのプログラミングガイドはこちら

 

HLSLとは?

HLSL(High-Level Shader Language)は、MicrosoftがDirectX用に開発したGPUプログラミング向けの高水準言語です。

頂点処理、ピクセル処理、ジオメトリ処理など、複数のステージで動作するシェーダーを記述するために設計されています。

HLSLはC言語に似た構文を持ち、型安全な記述が可能です。

データの型(float, float3, matrixなど)を明示的に管理しつつ、並列計算や演算最適化に最適化されており、リアルタイムグラフィックスのパフォーマンスを最大限に引き出します。

ちなみに、CPUとGPUの違いを面白く紹介してくれている動画が下記です。

要は複雑な処理を一人でするのがCPUで、簡単な処理を複数人でするのがGPUってことです。

GPUが並列処理を得意としているってのがよくわかりますね。

 

Shader GraphとShaderLabのどちらを選ぶべきか?

いうまでもなく、初学者はShader Graphを選びましょう。

Shader Graphを習得し、それで満足できなければShaderLabを習得するという方向でいいと思います。

習得じゃなくて、開発でどちらを使うべきか?という質問には下記で回答します。

 

開発規模や目的別の選択指針

小規模、短期開発、試作段階ならShader Graphで、高度な制御や特殊な表現が必要そうならShaderLabでの実装をしていくのがいいでしょう。

ShaderGraphはコンパイルするとShaderLabに変換されるので、Shader Graphで出来ることで、ShaderLabで出来ないことはありません。

逆にShaderLabで 出来ることでも、Shader Graphだとできないことはあります。

【参考URL】

ShaderGraphで”できないこと”から考える、実践的な活用法 #ポケテク

ShaderGraphの実用的活用法 [Unityゲームグラフィックス実践] 

 

私の調べた限りだと、Shader GraphをShaderLabに変換するような機能はなさそうです。

Shader Graphを使って大規模なシェーダーを作ってしまった後にできないことが判明してしまうと、大きな痛手を追うことになるかもしれません。

そのため、あらかじめ表現のレベルが高そうなゲームではShaderLabを使っておいた方が無難なんじゃないかと思います。

 

まとめ

Shaderは、Unityにおける描画表現のコアであり、ビジュアル面のクオリティを大きく左右する重要な技術です。

初心者のうちはShader Graphを使って直感的に表現を試し、より高度な制御が必要になった段階でShaderLabやHLSLに挑戦する流れが自然です。

また、どのレンダーパイプラインを選ぶかによって、使用できるShaderの種類や記述方法が大きく変わるため、プロジェクト開始時の選定も重要です。

まずは使いたい表現が「環境によって変化するものかどうか」を意識して、UnlitとLitの使い分けから始めてみましょう。

Shaderの理解が深まることで、Unityの表現力は格段に広がります!

次の記事ではShader Graphに実際触れながら、基本的な解説をしていきます。

次記事:【Unity Shader入門②】Shader Graphの使い方と基本ノードを完全図解|マテリアル作成の第一歩

-Unity, シェーダーを学ぶ