Unity_Shaderことはじめ（#00_基礎知識編）

# Shaderことはじめ(Unity編)

## はじめに
Shaderの学習初めの記事を書きます。

## Shaderとは
`「GPU を利用し高速にgraphicsを描画するための技術や概念の総称」`

### Shaderの特徴
* 多くの場合において,高い演算能力を誇る GPU を駆使し高速に計算を行う
* graphics 生成のあらゆる行程で活躍する
* 役割に応じて xx shader, というふうに名前が付けられている場合が多い

## 3D API と shader の関係
3DCG を描くためには, 多くの計算や行程が必要で GPU と呼ばれる高速な演算装置を用いる(大抵のPCには詰まれています)

### GPUがつまれているPCって?
大抵のPCにつまれています.

* CPU とメモリを共有しているタイプの安価なもの(大抵のPCはこっち！)
* GPU としての性能に特化したグラフィックボードと呼ばれる専用パーツ(主にゲーミングPC)

と様々な種類です.

### GPU を利用するためのインターフェース（API）
GPU を利用するためのインターフェース（API）には, OSの種類や, その用途に合わせていくつかの種類がある.

* WindowsのGPU API → DirectX
* OSSの著名な API → OpenGL

### GPUのAPIの働き
APIは非常に低レベルで, ハードウェア（GPU）に近い部分でアプリケーションとハードウェアとのめんどくさい処理を取り持ってくれます.

ちなみに、話題のちなみに話題 [Vulkan](https://en.wikipedia.org/wiki/Vulkan_(API)) や [Metal](https://en.wikipedia.org/wiki/Metal_(API)) メタルは, これより低layer

## [OpenGLとは](https://ja.wikipedia.org/wiki/OpenGL)
クロノス・グループ (英: Khronos Group) が策定している、グラフィックスハードウェア向けの2次元/3次元コンピュータグラフィックスAPI

モバイル向けAPIに <b>OpenGL ES</b> がある.

### OpenGLのAPIの種類

|用語|概要|
|:---------|:------------------------------------------------|
|OpenGL|GPU を利用するための 3D API|
|OpenGL ES|OpenGL のファミリーの中で, mobel端末向けに軽量化されたもの|
|WebGL|OpenGL ES を Browser から制御できるようにしたもの|

## [GLSLとは](https://ja.wikipedia.org/wiki/GLSL)
<b>OpenGL Shading Language</b>の略 C言語をベースとした高レベルシェーディング言語

アセンブリ言語やハードウェアに依存した言語を使わないで, 開発者がグラフィックスパイプラインを直接制御できるようにOpenGL ARB (Architecture Review Board) で策定

## Cg/HLSLとは
### [Cgとは](https://ja.wikipedia.org/wiki/Cg_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))
CgはNVIDIAが開発していた, リアルタイム3次元コンピュータグラフィックスにおけるプログラマブルシェーダーのためのシェーディング言語

<b>C for Graphics</b> の略

### [HLSLとは](https://ja.wikipedia.org/wiki/High_Level_Shading_Language)
<b>High Level Shading Language</b>の略

マイクロソフトによって開発された, <b>Direct3D (DirectX)</b> で使われるプログラマブルシェーダーのためのプロプライエタリなシェーディング言語である

NVIDIAと協力して開発されたことから、言語文法が <b>Cg（C for Graphics）</b> 言語に非常によく似ている

## Unityでのシェーダーの種類

### 3種類

1. サーフェイスシェーダ（Surface Shader）
1. 頂点 / フラグメントシェーダ（Vertex / Fragment Shader）
1. 固定関数シェーダ（Fixed Function Shader）

### 頂点 / フラグメントシェーダ（Vertex / Fragment Shader）
<b>言語：Cg/HLSL</b>

頂点シェーダ／フラグメントシェーダは,普通のプログラマブルシェーダです.

### サーフェイスシェーダ（Surface Shader）
<b>言語：Cg/HLSL</b>

ライティングなどをUnity側でよしなにしてくれるタイプのシェーダで、<b>Unity</b>独自のShader

### 固定関数シェーダ（Fixed Function Shader）
<b>言語：ShaderLab</b>

シェーダをサポートしていない端末の場合に利用されるもの

## Vertex / Fragment Shaderの概要
### Vertex Shader
3DCG に欠かすことのできない, vertex の座標変換を主な役割とする shader.

vertexがひとつで点を, vertexがふたつで線を, それ以上の個数の vertex を使うことで三角形や四角形を表現するのが, 3DCG の一般的な概念です.

VertexShader は, この vertex ひとつひとつを制御するためのものです.

<b>vertex の個数＝vertex_shader が実行される回数</b>

描画する vertex が少なければ VertexShader の負荷も少なくなる.

### Fragment Shader

API の種類によっては, PexelShader などと呼ばれることもある.

Fragment Shader は vertex_shader とは役割が異なり, 最終的に Screen に描かれる Pexel ひとつひとつ を対象とした処理を行います.

<b>画面の解像度が大きいと, fragment_shader による負荷は大きい</b>.

vertex_shader は vertex の個数に比例して負荷が増えますが, fragment_shader は実行される pexel 数が増加するにしたがって performance が落ちていきます.

両者の違いについてはしっかり理解しておきましょう.

* VertexShader - 頂点の個数分だけ頂点ごとに実行される
* FramgentShader- 描画するpexel単位で実行される

## 参考

* [GLSL スクール 2016](https://webgl.souhonzan.org/entry/?v=0703)
* [シェーダーリファレンス](https://docs.unity3d.com/jp/current/Manual/SL-Reference.html)