プログラマブルシェーダー

提供: MonoBook
2019年8月14日 (水) 03:14時点におけるimported>Administratorによる版
ナビゲーションに移動 検索に移動

プログラマブルシェーダー英語:programmable shader)とは、グラフィックカード上のシェーダーで独自のプログラム(カスタムシェーダー)を実行させられるものをいう。

概要

初期のシェーダーは「ハードウェアT&L(最近では対義語的に固定シェーダーと呼ばれることが多い)」などと呼ばれ、いわゆるAPI的な感じで「ライティングをする」などの固定機能がGPUに用意されており、プログラマーは何も考えずポリゴンモデルやテクスチャや座標などをGPUに送信すると表示用の一枚ペラの絵が返ってくるというものであった。この方式は簡潔明瞭という利点と、だれが作っても似たように絵になるという欠点があった。

これをアセンブラのようなプログラミング言語で自前で記述できるようにしたのがプログラマブルシェーダーである。後にHLSLGLSLなどの高級言語などが登場したが、それでも3Dを扱うプログラマーに求められる作業量・記述量は劇的に増えた。

その結果、よほどの事がないかぎり固定シェーダーでこと足りるのにそんなアホくさいことに労力を割くのは得策ではないとしてUnityUnreal Engineなどのゲームエンジンが爆発的に普及した。

デバッグ

ステップ実行やウォッチ変数などを搭載した「まとも」なデバッガがあるのはHLSLだけである。Visual Studio (communityエディションにもある)に搭載されている「Visual Studio Graphics Analyzer」しか存在しない。これはCPU上でGPUエミュレーションし、その上で「最初の1スレッド目だけ再現」しているらしい。

XcodeMetalではパイプラインの実行順序くらいしか確認できないのでデバッガはないに等しい。GLSLWebGLを使った「見た目でデバッグ」というウェブサービスがあるが計算ミスまでは特定できない。GPUだと「print文でログや変数表示」などという原始的なデバッグすらできないので「まとも」なデバッガの存在は非常に重要なのである。

プログラマブルシェーダーを使うのであれば、環境を問わず、まずはHLSLで書いて、そこから移植するというのが正しい手順であると言える。OpenGLの中の人達が作ったValkanではGLSLに加えHLSLも採用された。宗教上の理由だけでは超えられない壁があるということである。

関連項目

  • CUDA = 最先端、NVIDIA製品でしか動かない
  • HLSL = CUDAから実験的な機能を排除したもの。唯一まともなデバッガがある。
  • GLSL = OpenGLValkanなどで使われている。
  • Metal = Apple製品はOpenGLが禁止されこれ一本になった