ARB アセンブリ言語は、アセンブリ言語として特徴付けられる低レベルのシェーディング言語です。ハードウェアグラフィックス パイプラインを制御するGPU命令を標準化するために、 OpenGL Architecture Review Board (ARB)によって作成されました。
歴史
テキサス インスツルメンツは1985 年に最初のプログラム可能なグラフィック プロセッサTMS34010を開発しました。これにより開発者はプロセッサにコードをロードして実行し、ビデオ ディスプレイのピクセル出力を制御できるようになりました。その後、1989 年に TMS34020 と TMS34082 が開発され、プログラム可能な 3D グラフィック出力が可能になりました。
Nvidia は1995 年に、二次テクスチャ マッピングをサポートする最初のビデオ カードNV1をリリースしました。その後、 1997 年にRiva 128 (NV3) がリリースされ、 Direct3D用の初のハードウェア アクセラレーションが提供されました。
さまざまなビデオ カード ベンダーが独自のアクセラレーション ボードをリリースしており、それぞれがGPU操作用の独自の命令セットを備えています。OpenGL Architecture Review Board (ARB) は、GPU 業界の標準を確立することを目的として 1992 年に設立されました。
ARBとNvidiaは、GPUプログラミングを標準化するためにいくつかのOpenGL拡張機能を確立しました。 [1]
- EXT_texture_env_combine - テクスチャを結合するプログラム可能な方法を提供します。
- NV_register_combiners - GeForce 256
- NV_vertex_program - GeForce 3
- NV_テクスチャ_シェーダー - GeForce 3
- NV_texture_shader3 - GeForce 4
- NV_vertex_program2 - GeForce FX
- NV_fragment_program - GeForce FX
これはARBの2002年のリリース で最高潮に達した。
- ARB_頂点プログラム[2]
- ARB_フラグメント_プログラム[3]
これら 2 つの拡張機能は、それぞれ 3D 頂点と補間されたピクセル プロパティの GPUパイプラインを制御するアセンブリ言語の業界標準を提供しました。
後続の高レベルシェーディング言語は、この ARB 標準にコンパイルされることがあります。現在、3D 開発者はGPUプログラミングに C のような高レベル シェーディング言語を使用する傾向が高まっていますが、ARB アセンブリには幅広いハードウェアでサポートされているという利点があります。
ただし、ループや条件文などの一部の機能は ARB アセンブリでは使用できないため、それらを使用するには、NV_gpu_program4 拡張機能または GLSL シェーディング言語のいずれかを採用する必要があることに注意してください。
すべての主要なグラフィックス カード メーカーは、NVIDIA Geforce FX シリーズ、AMD R300ベースのカード (Radeon 9500 シリーズ以上)、およびIntel GMA 900以来、長年にわたって ARB アセンブリ言語をサポートしています。[4]ただし、標準の ARB アセンブリ言語はPixel Shader 2.0レベルであり、 GLSLより古いため、機能がほとんどありません。nVidia は、 GeForce 8 シリーズで導入された最新の OpenGL 3.x 機能と ARB アセンブリの高速コンパイル速度を組み合わせた独自の拡張を ARB アセンブリ言語に対して行っていますが、ほとんどの非 nVidia OpenGL 実装では、独自の nVidia 拡張が ARB アセンブリ言語に対して提供されておらず[5]、アセンブリですべてのシェーダー機能に直接アクセスする他の方法も提供されていないため、アセンブリの方が適切なマシン生成シェーダーでも GLSL の使用を余儀なくされています。
詳細
ARB_頂点プログラム
ARB Vertex Program 拡張機能は、ARBvp1.0 アセンブリ命令を読み込み、選択したプログラムを有効にし、さまざまな GPU パラメータを設定するための API を提供します。
頂点プログラムは、位置、法線、テクスチャ座標などの頂点プロパティを変更するために使用され、次のパイプライン プロセス (多くの場合はフラグメント シェーダー、最近ではジオメトリ シェーダー) に渡されます。
ARB_フラグメント_プログラム
ARB フラグメント プログラム拡張機能は、ARBfp1.0 アセンブリ命令を読み込み、選択したプログラムを有効にし、さまざまな GPU パラメータを設定するための API を提供します。
OpenGLフラグメントは補間されたピクセル定義です。GPUの頂点プロセッサは、頂点セットによって制御されるすべてのピクセルを計算し、それらの位置やその他のプロパティを補間して、フラグメント プロセスに渡します。フラグメント プログラムを使用すると、開発者はこれらのピクセル プロパティを、表示用にフレーム バッファにレンダリングされる前に変更できます。
OpenGLパラメータ
- Attribパラメータは、頂点法線などの頂点ごとの属性です。
- ローカルパラメータは、特定のシェーダ パスのプログラムのデータ セット全体に適用されます。
- Envパラメータはすべてのプログラムに適用されます。
ARB変数
すべての ARB アセンブリ変数は float4 ベクトルであり、xyzw または rgba サフィックスでアドレス指定できます。
レジスタは、1 つの要素のみをアドレス指定できるスカラー変数です。
- ADDRESS変数はレジスタです。
- ATTRIB は頂点ごとの属性です。
- PARAM は、定数、Env、または Local などの均一なプロパティです。
- TEMP一時変数。
- ALIAS は変数の別名を提供します。
- OUTPUT はパイプラインに返される変数を指定します。
頂点属性
ARB アセンブリは、頂点属性に対して次のサフィックスをサポートします。
- 位置
- 重さ
- 普通
- 色
- 霧座標
- テキスト座標
- マトリックスインデックス
- 属性
状態マトリックス
ARB アセンブリは次の状態マトリックスをサポートします。
- モデルビュー
- 投影
- テクスチャ
- パレット
- プログラム
次の修飾子を使用できます。
- 逆
- 転置
- 不正転載
ARB 組み立て手順
ARB アセンブリは次の命令をサポートします。
- ABS - 絶対値
- 追加- 追加
- ARL - アドレスレジスタのロード
- DP3 - 3成分ドット積
- DP4 - 4成分ドット積
- DPH - 同次ドット積
- DST - 距離ベクトル
- EX2 - 指数 2 を底とする
- EXP - 2 を底とする指数 (近似値)
- FLR - フロア
- FRC - 分数
- LG2 - 2 を底とする対数
- LIT - 光係数を計算する
- LOG - 2を底とする対数(近似値)
- MAD - 掛け算と足し算
- MAX - 最大
- MIN - 最小値
- MOV - 移動
- MUL - 乗算
- POW - 累乗する
- RCP - 逆数
- RSQ -逆平方根
- SGE - より大きいか等しい場合に設定
- SLT - 以下に設定
- SUB - 減算
- SWZ - 拡張スウィズル
- TEX - テクスチャ検索
- XPD -クロス積
これはアセンブリ命令の部分的なリストにすぎません。リファレンスは、OpenGL のシェーダー アセンブリ言語 (ARB/NV) クイック リファレンス ガイドで参照できます。
ARB アセンブリでは、フロー制御や分岐の命令は提供されません。SGE と SLT は、条件付きでベクターまたはレジスタを設定またはクリアするために使用できます。
ARB インターフェースは、アセンブリ言語のコンパイル手順を提供しません。
GL_NV_fragment_program_option は、追加の命令で ARB_fragment_program 言語を拡張します。GL_NV_fragment_program2、GL_NV_vertex_program2_option、および GL_NV_vertex_program3 はそれをさらに拡張します。
サンプルコード
簡単なARB頂点シェーダのサンプル
!!ARBvp1.0 TEMP 頂点クリップ; DP4 vertexClip.x、state.matrix.mvp.row[0]、vertex.position; DP4 vertexClip.y、state.matrix.mvp.row[1]、vertex.position; DP4 vertexClip.z、state.matrix.mvp.row[2]、vertex.position; DP4 vertexClip.w、state.matrix.mvp.row[3]、vertex.position; MOV 結果.位置、頂点クリップ; MOV 結果.色、頂点.色; MOV 結果.texcoord[0]、頂点.texcoord; 終わり
簡単なARBフラグメントシェーダーのサンプル
!!ARBfp1.0 TEMPカラー; MULカラー、fragment.texcoord[0].y、2.0; 色を追加、1.0、-色; ABSカラー、カラー; result.color、1.0、-colorを追加します。 MOV結果.color.a、1.0; 終わり
参照
参考文献
- ^ Simon Green. 「OpenGL におけるプログラミングの歴史」(PDF)。
- ^ ARB. 「ARB_vertex_program」。
- ^ ARB. 「ARB_fragment_program」。
- ^ Wildfire Games. 「ARB アセンブリ言語をサポートするグラフィック カードと OpenGL レンダラーのリスト」。
- ^ Wildfire Games. 「nVidia の ARB アセンブリ言語拡張をサポートするグラフィック カードと OpenGL レンダラーのリスト」。
