Skip to main content

シェーダー

シェーダーはGPU(グラフィックスカード)で実行する特別なプログラムである。シェーダーを使うことにより、3Dモデルの「見せ方」(描画)などを自由に変えることができる。ただし、GPUで実行するプログラムは普通のCPUのプログラムと異なり、使い方を学ばないといけない。

GPUとCPUの違い

CPUは「多目的のプロセッサー」で、タスクを切り替えるのは得意な要素である。例えば、Chromeでネットを調べ、見つけたソースコードをVisual Studioに貼り付けたい。プログラムを切り替えるときに、CPUは一旦Chromeを休ませて、Visual Studioを起こして、作業をし続ける。

 一方、GPUは「専門的な部品」である。GPUは同時に1つのタスクしかできず、実行中に切り替えることができない。代わりにそのタスクを大変高速に実行ができる。


CPU GPU
目的 多目的。同時に様々なプログラムを実行できる(マルチタスク) 専門的。同時に1つのタスクしかできない(描画のみ)※1
タスク切り替え 実行中にタスクを切り替えできる タスクが終わってから切り替えることができる
切り替えるコスト 低い 高い
条件分岐(if) 条件により、実行の流れを切り替えることができる。 できない※2
並列化

コアが空いていれば、ある程度並列化できる

非常に強い(千~万単位のコアがある)

※1:計算専用の「Compute Shader」というものが存在する。計算シェーダーは描画のためではなく、並列化し、速くなる処理に使える。
※2:「if」命令があるが、実行コストが高くて、できるだけ使わないようにしましょう。

GPUとCPUの協力:シェーダーの流れ

 OS(Windows)は、ゲームをハードディスクからメモリに転送し、CPUはメモリから1行ずつの命令を読み、実行する。今まで作ってきたスクリプトのすべてはこの流れで実行する。

 ただ、ゲームを実行中に「これからGPUのプログラム(シェーダー)が始まる」という特別な命令が現れる可能性がある。この時、CPUは一旦ゲームを休んで、そのプログラムをGPUに転送する。転送し終わったら、ゲームをもう一度起こして、普通の動作に戻る。

TODO:切り替えの流れの画像をついか!

この「一旦止まり→転送→続く」の処理効率が悪いため、GPUのタスク(プログラム)を切り替えるコストが高いといわれる。従って、できるだけゲーム開始の時に必要なシェーダーをGPUに転送し、その後にあまり変わらないようにすれば良いでしょう。

 Unityはある程度にシェーダーの転送をしてくれるため、実装しなくても大丈夫だが、ゲームエンジンにより、手動でシェーダーの転送をおこなわないといけない。

 シェーダー(プログラム)の他に、必要なデータも転送しなければならない。シェーダーの場合は、主なデータは3Dモデルの頂点や三角形、または位置や変換などである。Unityの「標準シェーダー」の場合はすべてのデータを自動的に転送されるが、「カスタムシェーダー」の場合は、一部のデータを手動で送信する必要な時もある。

TODO:転送画像をついか!

 これからUnityのシェーダーについて学び、そして特殊な効果を再現するため、カスタムシェーダーの作り方を学ぼう。

シェーダーとマテリアルの関係性

Unityでは「シェーダー」と「マテリアル」2つの概念がある。シェーダーはGPUで実行するプログラム。マテリアルは「一部のパラメータを設定したシェーダー」のこと。例えば、シェーダーに「Color」というパラメータがあるとしたら、マテリアルでは「Color=Red」にする。

 従って、1つのシェーダーからたくさんのマテリアルを作成することができる。例えば、以下の「赤いプラ」「輝く金属」と「草と土」が全く同じシェーダー(Universal Render Pipeline / Lit)を使用しているが、パラメター(色、金属性、滑らか性、など)を変えることによって、様々な表面を作ることが可能。

image.png

URP(Universal Rendering Pipeline)のシェーダー

UnityのURPモードは、すぐ使えるたくさんのシェーダーがあるので、最も使うシェーダーについてを細かく見てみましょう。

光と陰の計算あり(Universal Render Pipeline / Lit)

image.png

URP で新しいマテリアルを作成すると、このシェーダーになる。いくつかのパラメータがあるので、よく使うのを確認しましょう。

Workflow Mode

反射の計算方法。2つがある:

  • 「Metallic」は膨大な素材を再現できる。主には金属を再現するのは得意
  • 「Specular」軽くて速い。金属を再現できず、主にプラスチックの雰囲気を再現するモード
Surface Type

透明設定。2つがある:

  • 「Opaque」不透明。計算するは速い
  • 「Transparent」半透明。後ろのあるものも計算しないといけないので、比較的に遅い
Render Face

見えない三角形(裏側)も描画するかしないか

  • 「Front」表のみ
  • 「Back」裏のみ
  • 「Both」両面
Alpha Clipping

透明度(Alpha)はある数値以下をし下回ると透明になる。この設定は「不透明(Opaque)」でも効く

image.png

 

image.png

image.png

透明(Alpha)を持っている画像

Alpha Clippingなし

Alpha Clippingあり

Base Map

模様と色。画像(テクスチャ)を使わないなら、一定の色になるが、テクスチャを使うと模様を付けることができる。

image.png

Base Mapなし(色のみ)

image.png
テクスチャ

image.pngBase Mapあり

なお、テクスチャを正しく貼り付けるため「UV座標」が必要である。「UV座標」については、また後で説明する。

Metallic Map / Specular Map

金属(またはプラスチック)である部分・ではない部分のテクスチャ。全体的に変わりがなければテクスチャは不要であるが、部分的に変えたいなら、このテクスチャを設定:

image.png

Metallic Map なし

image.png

テクスチャ

image.png

Metallic Map あり

Smoothness

表面のなめらかさ。数値が高いほど表面が輝くパラメータ

Normal Map

法線マップのテクスチャ。光の計算を変えるテクスチャであり、細かい凸凹を再現するための特別な画像。

image.png
Normal Map なし

image.png
法線マップ

image.pngNormal Map あり

Emission

光る色とテクスチャ(実際に光らないが、光るようにみえる)

image.png

image.png


image.png

image.png

image.png

image.png