これからShaderを学び始めようとすると、少しばかり体力がいる。
とはいえ、かなりニーズが出てきたとともに導入が簡易的になってきたのも、また事実。
しかし、基礎がわからないと結局はハリボテになってしまうのもまた事実。
体系的なドキュメントが揃っていないので、習得することのハードルも上がっている。
というわけで、これからノンコーダーが始めるシェーダーの習得についてのフローと戦略を考えてみようと思う。
これは、自身がShader習得において路頭に迷ってしまっているため、改めて指針を整理するとともに自分の学習進捗を図るものでもある。
前半部分は助長的な書き方になってしまうが、知っておくべきことは至ってシンプルである。
※このフローは実践しながら適宜修正を行っていく。ひとまず、キーワードから書き連ねることとする。
まず、シェーダーを理解するために必要なこととして 考えられることとして
あたりかと思う。
CPUに負荷をかけずに直接GPUで描画処理を行える、3DCGの表現に特化したプログラムのこと。
シェーディングは、イラストレーションや3DCGにおけるシェーディング処理(陰影をつけて立体感に見せる処理)のことを指しているが
シェーダーはそれをコーディングによりプログラムから描画するものとして使われる言葉になっている。
リアルタイムレンダリングに長けているため、ゲームやインタラクティブコンテンツに利用される傾向がある。
Shaderを知る上で、PCの仕組みについて最低限知っておく必要がある。
ここでは、PCの仕組みについて掘り下げないが、PCには様々なモジュールの集合体であり、個々のモジュールは決められた処理に特化している。
CPUとGPUは、PCの中でも重要な役割を占めている。
CPUは主に複雑な演算処理に長けたモジュールであり、GPUは一度に大量な演算処理が可能で描画処理に長けたモジュールのことであると認識しても良い。
こちらの記事を参考に。
CPUとGPUという言葉は、ここ近年でも一般的に耳にする機会が増えたと思うし、専門分野の職業についていない人でも認知され始めているのは
PCゲームやディープラーニングなどの普及によるものでもある。
これまで、オンボードタイプのマザーボードとして扱われることも多かったが 、技術の進化に伴いグラフィックに対するニーズが高まってきた。
そのため 、GPUは近年凄まじい進化を遂げており、グラフィックボードという形で独立したGPU処理を行う基盤としても販売されている程である。
普段、PCの画面で見ている映像はGPUにより処理され、モニターに出力されている。
描画するものは様々で、Webページからソフトウェアの操作画面、ゲーム、動画や静止画、PC自体の操作画面などである。
※図
3DCG オブジェクトは、データとしては3DCGで保持しているものの、描画する際には2Dに変換される。
そのため、描画されている以上のデータがCPUに保持されている。
また、同時にゲーム、3Dオブジェクトの演算処理、そして起動しているソフトウェアなどがある場合、さらに負荷がかかっている。
3DCGの制作ではプリレンダーと呼ばれる手法で表現。しかし、プリレンダー系のソフトウェアでは高グラフィックを実現できるものの
レンダリングという処理に時間がかかる。
3DCGゲーム、例えばプレステーションやNintendo64など、ローポリのオブジェクトを使うことでリアルタイムな表現を実現していた。
(ゲームに関してはそれぞれのコンソール機器の設計がPCとは異なっているというのもあるが)
より高グラフィックでリアルタイムに表現できるものが求められる。
そこで、登場したのがシェーダーである。
シェーダーはGPU内で、高グラフィックの処理を実現する思想でありアーキテクチャである。
一般的に、GPGPUと呼ばれることが多い。
前述したとおり、CPUの設計には限界があり、リアルタイムレンダリングでの高グラフィックを実現できない。
そのCPUの演算処理をGPUで直接処理してしまおうとおいうのがシェーダーの特徴である。
シェーダー自体は、3DCG制作用のソフトウェアに個々のメーカーが実装しているが、自ら開発できるように。
過去のシェーダーではアセンブリによるプログラミングを必要としていたが、Chronosが開発したシェーダープログラミングが可能なGLSLを皮切りに発展している。
シェーダーは、レンダーパイプラインと呼ばれる。
3DCG制作と書いているが、まず2次元からスタートすることとなる。
シェーダーは、CPUに依存していた描画演算処理をGPUで行うアーキテクチャである。
進化し続けているGPUにはありあまる処理能力があり、高グラフィックの表現が可能となる。
その反面、学習コストがまだ高いと言える。
どちらも描画処理のAPIでありDirectXはMicrosoftが開発、OpenGLはChronosが開発。
一般的に前者はWindows、後者はMacやLinuxなどその他の認識が多く、また各メーカーが開発しているGPUにも得意不得意が左右されることが多い。
しかし、Chronosが開発しているOpenGLはオープン標準規格として公開したことでOpenGLの普及が進んだ。
GLSLはOpenGL専用の言語であり、HLSLはDirectX専用の言語でもある。
それぞれ、アップデートが続けられているためバージョンがあり、対応しているGPUが存在しているため注意。
そのため、一般的にシェーダーを扱う場合、GLSLのことが多くなった。
ベースとなる言語はC言語である。
Web用のシェーダー言語である。
WebはHTMLとCSS、そしてJavascriptの組み合わせで提供されることが一般となった。
WebGLはOpenGL_GLSLをベースとしたJavascriptでのプログラムが可能となっている。
GLSLの学習順としては、FragmentShader→VertexShader→GeometoryShaderの順番に行う。
ComputeShaderは上記のパイプラインとは独立しているため 、後回しにする。
[GLSLの概念を学ぶ]
[それぞれの環境でGLSLを学ぶ]
基本的な概念はどのツールでも同じ。ただし、ツールごとに命名規則が異なっていたりするので注意。
以下のドキュメントは、UnityでのShader入門になるが概念としても非常にわかりやすくまとめられている。
Web開発に馴染みのない方は、Processingで始めると良いです。
[シェーダーから派生する技術・用語の読解]
ノイズの種類
レイ
ライティング
[グラフィック参考]
[キーワード]
PBR
VectorField(.fga)
Generative Art
[TouchDesigner向け]
ShaderToyなどのライブラリでFragmentShaderをまず学ぶ
既存のTopノードとの組み合わせを攻略する。Ramp,Noiseあたり。既に内部でGLSLとして最適化されている。
VertexShaderはその次、VertexShaderArtなどで学ぶ。
※最後のあたりはまとめれてません。