HLSL
[Wikipedia|▼Menu]
HLSLプログラムをサポートするのはDirect3D 9以降をサポートするシステムに限られるため、かつてはWindows OSおよびXbox 360以降のXboxシリーズが主な動作環境であったが、Vulkan向けのシェーダープログラムを事前コンパイルして中間表現SPIR-V(英語版)を生成するコンパイラglslangValidator[17]がGLSLとHLSLの両方に対応したことなどもあり、クロスプラットフォームでのHLSLの活用が進んでいる。

アプリケーションの実行時にHLSLソースコードをコンパイルしてバイトコードを生成する機能を組み込むためのD3DCompilerランタイムも提供されている[18]

他に、ゲームエンジンのUnityでは、シェーダープログラムの記述にHLSLが使用されている(かつてはCgが使用されていたため、一部に名残がある)[19][20]。なお、Windows上でDirectComputeベース (DirectX 11ベース) のコンピュートシェーダーを使用することができるが、Cgはコンピュートシェーダーに対応していないため、コンピュートシェーダーの記述には当初からHLSLが使用されていた[21]。UnityはCg/HLSLからGLSLへのトランスレーションが可能なため、OpenGL 4.3やOpenGL ES 3.1のコンピュートシェーダーを用いる場合でもGLSLではなくHLSLを使用することが推奨されていた[22]

LLVM/ClangベースのHLSLコンパイラdxc.exeもGitHub上で開発が進められている[23]。こちらはDirectX Intermediate Language (DXIL) と呼ばれる別の中間言語コード[24]を生成するが、これまでのfxc.exeが生成するバイトコード (DXBC) とは互換性がない。
エフェクト

HLSL自体は、シェーダー関数および各シェーダーステージのエントリーポイント(いわゆるメイン関数)を記述するために使われるが、この複数のシェーダーステージをまとめて管理・適用する「エフェクト」と呼ばれる仕組みも存在する。つまり、例えば2つの頂点シェーダーエントリーポイントVS1(), VS2()と2つのピクセルシェーダーエントリーポイントPS1(), PS2()を単一のHLSLソースプログラムファイル(通例.fx拡張子が付けられ、エフェクトファイルと呼ばれる)に記述し、さらにVS1+PS1, VS2+PS2, VS1+PS2, VS2+PS1といったシェーダーステージの組み合わせ(パス)のほか、各種レンダリングステートの設定をエフェクトファイル中に記述して関連付けることができる。エフェクトを扱うAPIはDirect3D 10のコアライブラリもしくはDirect3D 9/11のエクステンションライブラリ(D3DX)に用意されており、レンダリングパイプラインの管理をC++コードから分離することができる。
WPFエフェクト

Windowsデスクトップアプリケーションフレームワークの1つであるWPFでは、グラフィックスのレンダリングにDirect3Dが使用されているが、GUIウィジェットにブラー(ぼかし)やドロップシャドウといったエフェクト(フィルター)を適用することが可能となっている。さらにWPFではユーザープログラマーがHLSLで作成したピクセルシェーダーを使用してカスタムエフェクトを適用することもできる[25]

WPF 3.5まではシェーダーモデル2.0のピクセルシェーダーのみがサポートされていたが、WPF 4ではシェーダーモデル3.0のピクセルシェーダーも使用できるようになった[26] [27]
Direct2Dエフェクト

DirectXファミリーの1つ、2次元コンピュータグラフィックスAPIであるDirect2Dでは、バージョン1.1にてエフェクト機能が実装されたが、HLSLによるカスタムエフェクトを作成・利用することも可能となっている[28]
シェーダーモデル「en:High-Level Shading Language」も参照

Direct3Dプログラマブルシェーダーを実行するには、Direct3D 8以降に対応したハードウェアが必要となる。ただし、Direct3D 9までの場合、頂点シェーダーだけはソフトウェアすなわちCPUでエミュレートすることもできる(D3DCREATE_SOFTWARE_VERTEXPROCESSING)ため、固定機能ピクセルシェーダーと組み合わせることによりDirect3D 7以前の古いハードウェアでプログラマブルシェーダーを実行することも可能である。また、Direct3D 10.1以降では比較的高速なソフトウェアレンダリングエンジンであるWARPデバイスも実装されているため、GPUが対応していなくてもCPUにDirect3Dレンダリングを実行させることもできる。

Direct3D対応ハードウェア(グラフィックスカード)の世代によって、GPU上にてハードウェアレベルで実行可能なシェーダープログラムの仕様(制約、機能など)が異なる。この仕様はシェーダーモデルと呼ばれ、新しい世代のシェーダーモデルをサポートするハードウェアは基本的に古い世代のシェーダーモデルもサポートする[29]が、ベンダーごとに拡張された2.0a/2.0bなどの例外も存在する。なおHLSLがDirect3Dに搭載されたのはバージョン9以降だが、シェーダーモデル2.0以降でないとHLSLを使えないというようなことはなく、HLSLを使用してシェーダーモデル1.xレベルのプログラムを記述することも可能である。また、Direct3D 10では、アセンブリ言語によるシェーダープログラム開発が廃止され、シェーダーの記述にはHLSLのみが使用できるようになった[30]

シェーダーモデル3.0には頂点テクスチャフェッチ(Vertex Texture Fetch, VTF)と呼ばれる機能が存在するが、DirectX 9.0c世代で対応したのはNVIDIAのハードウェアのみで、ATIのハードウェアではサポートされなかった。逆に、浮動小数点バッファにおけるアンチエイリアス機能は、NVIDIAハードウェアではサポートされず、ATIハードウェアのみでの対応となっていた[31] [32]。他にも、(DirectX 11で標準化される前の)テッセレーション機能[33]がATIハードウェア上のみでサポートされる[34] [35] [36]など、シェーダーモデル3.0までは(たとえDirectX 9.0c対応を謳っていても)機能面において各社の足並みがそろわない状態にあり、これらの機能を利用するアプリケーション開発者は使用したい機能が実際にハードウェアでサポートされているかどうかをあらかじめDirect3DのCaps (Capabilities) 取得APIを使って一つ一つ調べなければならなかった。このようにベンダーごとに各機能の対応レベルがバラバラとなっていた悲惨な状況は、次のバージョンのDirect3D 10以降で要求仕様が厳格化されたことで、ある程度解消されることになる[37]

なお、Direct3D 10.1 APIでは4.xプロファイルのシェーダープログラムに加えてダウンレベルの2.0プロファイルが使用可能であり、Direct3D 11/12 APIでは5.xおよび4.xプロファイルに加えてダウンレベルの2.0プロファイルが使用可能だが、いずれも3.0プロファイルに関しては使用できない[38] [39] [40] [41]
DirectXバージョンと各シェーダーステージ

以下の表はハードウェアが対応しているDirectXバージョンと、そのハードウェアがサポートする各シェーダーステージの最上位バージョン(プロファイル)間の関係を示している。後述するように、実行可能なシェーダープログラムの最大命令数やレジスタ数、リソーススロット数などは新しいバージョンのほうが大きくなり、より柔軟で長大なプログラムを記述することができるようになる。

DirectX VersionPixel ShaderVertex ShaderGeometry ShaderHull ShaderDomain ShaderCompute Shader


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:56 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef