K
Shadow on a chair
Photo by Trude Jonsson Stangel on Unsplash

シェーダーについて (1)

WebGL について調べていく中で、シェーダーというのが出てくる。

チュートリアルなどでは「シェーダーとは陰影処理をするプログラムである」などと説明はそこそこに、「ではシェーダーを書いてみましょう」となるのだが、シェーダーの理解が覚束ないためサンプルのプログラムが何をしているのかいまいちよく掴めない、ということがよくあった。

シェーダーを理解する上で非常に役に立ったのが、その全体像を把握することだった。

そもそもやりたいことというのは、手元に 3D のデータがあり、これを 2D である画面への描画、つまりピクセルごとの色情報の列に変換することだ。ちなみに入力である 3D データがどこからくるかというと、Blender などのソフトを使ってモデリングという作業を行うわけだが、そういったことを含めて 3DCG という技術全体が成り立っている。

話を戻して描画に関して、この 3D から 2D への変換を一般的にレンダリングと呼ぶ。さらにこのレンダリングはパイプライン処理、つまりタスク全体をより小さいサブタスクに分けた上でバケツリレー形式で処理されるため、レンダリングパイプラインまたはグラフィックスパイプラインと呼ばれる。

シェーダーはこのレンダリングパイプラインの中で陰影をつける役割 (に今は限られず、様々な処理を行う) を担うのだが、ポイントはプログラム可能であるというところだ。

元々レンダリング処理は全て CPU 上で行なわれていたが、専用ハードウェアを用意することで高速化が図られた、というのが GPU の始まりである。

こうして登場した初期の GPU は機能が全て固定されて提供されていた。そのため新しい処理を実装したい場合にはハードウェアのリリースを待たなければいけなかった。

3D 技術が急速に発展し、要求も多様化するのに伴い、ハードウェアアップデートを待たずに機能を実装したいというニーズが生まれた。GPU ベンダーはハードウェアの一部をプログラム可能にすることでこの要求に応えた。

このプログラムこそが、「陰影処理をするプログラム」であるシェーダーである。


先にも書いたが、近年シェーダーの守備範囲は陰影処理に限られなくなっている。

シェーダーが実際にレンダリングパイプラインの中でどういった処理を行なっているのかについて、次回見ていきたい。

では、また。