シェーディング言語

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

シェーディング言語シェーダプログラミング(シェーディング)をより簡単に行うために採用された特別なプログラミング言語である。この種の言語は色や法線のような特別なデータ型を持っている。3Dグラフィックスの様々な市場に対応するため、複数の異なる言語が開発されている。以下にその概略を述べる。

プロダクションでのレンダリング[編集]

この種のシェーディング言語は最高画質を目指して開発されている。材質特性は全体的に抽象的で、プログラミングスキルはほとんど要らないし、ハードウェアの知識は全く必要ない。この種のシェーダは、アーティスト達がテクスチャマッピングやライティング、その他の作業を行って見たそのままに得られるように開発されている。

この種のシェーダの処理は、たいてい時間がかかる。シェーダが行う処理に必要な計算能力は、写実的な結果を得るためにより高価になり得る。大部分は巨大なコンピュータクラスター上で実行される。

RenderMan Shading Language[編集]

RenderManシェーディング言語(しばしばRSLないしSLと省略される)は、RenderManインタフェース仕様で定義されており、プロダクションレンダリングを行うのに最もよく使われているシェーディング言語である。また、この言語は最初に実装されたシェーディング言語でもある。

この言語は6つの主要なシェーダのタイプを定義している。

  • Light source shaders 光源上の点から照射面上の点への光の色を計算する。
  • Surface shaders 照射されるオブジェクトの光学的特性モデル。入射光と物体の物理的特性を考慮することにより、照射点における最終的な色と位置を計算する。
  • Displacement shaders は表面の図形をその地点の色に独立して操作する。
  • Deformation shaders 全体の空間をある定義された図形に変換する。唯一RenderManにのみ実装されているAIR rendererは実際にこのタイプのシェーダを実装している。
  • Volume shaders ボリュームを通して際の光の色を操作する。これらはフォグのような効果を生み出す。
  • Imager shaders 色を最終画素値に変形する。これはイメージフィルタのようなものであるが、imager shaderは量子化前のデータを操作するので、出力デバイスに表示するよりもより広いダイナミックレンジを持つ。

Houdini VEX Shading Language[編集]

Houdini VEX(Vector Expressions)シェーディング言語(略してVEXと呼ばれる)は、RenderManシェーディング言語に非常に似たものとして作られている。この言語は完全な3Dグラフィックスのパッケージ製品とに統合されているけれども、シェーダ開発者は、普通はレンダリング処理上不可能なシェーダ内部の情報へアクセスすることができる。RSLとVEXの間の言語の違いは主に構文の違いである。2、3のシェーダ命令の名前が異なっている。

Gelato Shading Language[編集]

Gelatoのシェーディング言語はHoudiniVEXのように、RenderManシェーディング言語に非常に似たものに作られている。Gelatoシェーディング言語とRSLの違いは主に構文の違いである。Gelatoは関数定義中の引数を区切る方法としてカンマの代わりにセミコロンを使用している。また2、3のシェーダ命令の名前とパラメータが異なっている。

リアルタイムレンダリング[編集]

近年まで、開発者は複数のビデオカードグラフィックスパイプラインからの出力を同じレイヤで制御することができていなかったが、今やリアルタイムレンダリングにシェーディング言語を用いる方法が広く使われている。このことにより、以前のハードコードされた変形方式やシェーディング方程式を用いた方法と比較して、ハードウェアの抽象度を高めつつより柔軟なプログラミングモデルを取ることができるようになった。この結果、プログラマはレンダリング処理全体をよりうまく制御することができるようになり、小さなオーバーヘッドでより高品質なコンテンツを開発することができるようになった。

驚くべきことに、これらのシェーダは最高のパフォーマンスを得るために、パイプライン上の適切な時点においてGPU上で直接実行されるように設計されており、またそのストリームプログラミングモデルのため、汎用処理においても成功を収めている。

この種のシェーディング言語は通常グラフィックスAPIに向けであるが、いくつかのアプリケーションでは機能制限付きではあるが組み込みシェーディング言語として提供している。

歴史上、ほんの2、3の言語のみが市場での地位を確立している。それらについて以下で簡単に概要を述べる。

ARB 低レベルアセンブリ言語[編集]

OpenGL Architecture Review Boardは2002年にグラフィックスプロセッサ向けの標準低レベル命令セットとしてARBを策定した。

ローディングと実行を行うために、高レベルOpenGLシェーディング言語はARBにコンパイルされる。高レベルシェーディング言語とは違い、ARBアセンブリはフロー制御や分岐をサポートしていない。しかしながらその移植性の高さから様々なGPUで使われ続けている。

OpenGL シェーディング言語[編集]

GLSLglslangとしても知られている。これはOpenGLと一緒に使われる高レベルシェーディング言語として標準化された。この言語は単一命令セットで頂点処理とフラグメント処理を統合し、条件ループと(より一般的な)分岐をサポートしている。歴史的に、GLSLの機能はARB_vertex_programARB_fragment_programのような様々なOpenGL拡張によって先行して開発されてきた。これらの拡張には制限があったり、低レベルであったり、アセンブリのような言語であって、それらの使い勝手は今やよくない。これらの拡張自身も今や新しいバージョンには生き残っていない他の拡張提案によって先行開発されてきた。

Cgプログラミング言語[編集]

NVIDIAによって開発されたこの言語は、簡単かつ効率的にプロダクションの作業パイプラインを統合できるようにデザインされた。この言語の特徴はAPI独立であることと素材管理を改善する非常に多くのフリーなツールからなっていることである。

最初のCg実装はハードウェア部を抽象化するが故により制限が多かったが、それ以前の方法に比べても革新的であった。Cgという言語自体は、最終製品にはめったに使われることはなかったが、より新しいシェーディング言語へのつなぎとして生き残っており、主にデジタルコンテンツ作成現場ではそれなりの地位を確立しているように見える。

Cgの特徴としては「コネクタ」、つまり様々な処理ステージを結びつける特別なデータ構造として使われることである。ここでのコネクタとは、アプリケーションから入力されたデータを頂点処理ステージに受け渡し、フラグメント処理への入力する際に補間を行う。

DirectX 高レベルシェーディング言語[編集]

これはおそらく今日で最も成功した言語である。主にマイクロソフトからの多大なサポートによる所もあるが、それと同時にリアルタイムレンダリング用途として最初のCスタイルシェーダ言語でもある。High Level Shader Language (HLSL) は以前は主にGLSLの競合としてリリースされたが、その機能はGLSLの機能と合わせるために異なるリビジョンが後にリリースされた。

外部リンク[編集]