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 や Metal メタルは, これより低layer
OpenGLとは
クロノス・グループ (英: Khronos Group) が策定している、グラフィックスハードウェア向けの2次元/3次元コンピュータグラフィックスAPI
モバイル向けAPIに OpenGL ES がある.
OpenGLのAPIの種類
用語 | 概要 |
---|---|
OpenGL | GPU を利用するための 3D API |
OpenGL ES | OpenGL のファミリーの中で, mobel端末向けに軽量化されたもの |
WebGL | OpenGL ES を Browser から制御できるようにしたもの |
GLSLとは
OpenGL Shading Languageの略 C言語をベースとした高レベルシェーディング言語
アセンブリ言語やハードウェアに依存した言語を使わないで, 開発者がグラフィックスパイプラインを直接制御できるようにOpenGL ARB (Architecture Review Board) で策定
Cg/HLSLとは
Cgとは
CgはNVIDIAが開発していた, リアルタイム3次元コンピュータグラフィックスにおけるプログラマブルシェーダーのためのシェーディング言語
C for Graphics の略
HLSLとは
High Level Shading Languageの略
マイクロソフトによって開発された, Direct3D (DirectX) で使われるプログラマブルシェーダーのためのプロプライエタリなシェーディング言語である
NVIDIAと協力して開発されたことから、言語文法が Cg(C for Graphics) 言語に非常によく似ている
Unityでのシェーダーの種類
3種類
- サーフェイスシェーダ(Surface Shader)
- 頂点 / フラグメントシェーダ(Vertex / Fragment Shader)
- 固定関数シェーダ(Fixed Function Shader)
頂点 / フラグメントシェーダ(Vertex / Fragment Shader)
言語:Cg/HLSL
頂点シェーダ/フラグメントシェーダは,普通のプログラマブルシェーダです.
サーフェイスシェーダ(Surface Shader)
言語:Cg/HLSL
ライティングなどをUnity側でよしなにしてくれるタイプのシェーダで、Unity独自のShader
固定関数シェーダ(Fixed Function Shader)
言語:ShaderLab
シェーダをサポートしていない端末の場合に利用されるもの
Vertex / Fragment Shaderの概要
Vertex Shader
3DCG に欠かすことのできない, vertex の座標変換を主な役割とする shader.
vertexがひとつで点を, vertexがふたつで線を, それ以上の個数の vertex を使うことで三角形や四角形を表現するのが, 3DCG の一般的な概念です.
VertexShader は, この vertex ひとつひとつを制御するためのものです.
vertex の個数=vertex_shader が実行される回数
描画する vertex が少なければ VertexShader の負荷も少なくなる.
Fragment Shader
API の種類によっては, PexelShader などと呼ばれることもある.
Fragment Shader は vertex_shader とは役割が異なり, 最終的に Screen に描かれる Pexel ひとつひとつ を対象とした処理を行います.
画面の解像度が大きいと, fragment_shader による負荷は大きい.
vertex_shader は vertex の個数に比例して負荷が増えますが, fragment_shader は実行される pexel 数が増加するにしたがって performance が落ちていきます.
両者の違いについてはしっかり理解しておきましょう.
- VertexShader - 頂点の個数分だけ頂点ごとに実行される
- FramgentShader- 描画するpexel単位で実行される