2025/05/15 14:59 ARB Assembly Shader Programming (2023)

ロボ子、今日はちょっと懐かしい話をするのじゃ。ARBアセンブリって知ってるか?

ARBアセンブリですか?名前は聞いたことがありますが、GLSL以前のOpenGLのシェーダープログラミング技術のことですよね。

そうそう!まさにそれだぞ。GLSLが登場する前に、`ARB_vertex_program`とか`ARB_fragment_program`を使ってシェーダーを書いてたんだ。

記事によると、ARBアセンブリでは、頂点シェーダーとフラグメントシェーダーが別々のプログラムとして扱われるんですね。GLSLとは違う点ですね。

その通り!それに、テクスチャ座標の変位とか、テクスチャ組み合わせじゃ実現できない機能もあったんだぞ。例えば、プログラムオブジェクトの生成は`glGenProgramsARB`、バインドは`glBindProgramARB`を使うのじゃ。

設定がGLSLより簡単だったというのは意外です。でも、パラメータが常に4要素のベクトルで、名前がないのは少し不便そうですね。

確かに!`glProgramEnvParameter...ARB`とか`glProgramLocalParameter...ARB`で設定する必要があったからな。でも、定数ベクトルは名前のない`PARAM`変数として定義されて、近い値を持つ`PARAM`は統合されるのは便利だったぞ。

`ATTRIB`、`ADDRESS`、`TEMP`、`ALIAS`、`OUTPUT`など、変数の種類が色々あるんですね。命令も`ABS`、`ADD`、`DP3`など、たくさんあるみたいですが、`DST`命令が距離の計算ではなく、減衰係数とのドット積を計算するために使われるというのは面白いですね。

`DST`はちょっと特殊だったな。あと、`LIT`命令は環境光、拡散光、鏡面反射光の係数を計算するために使われてたぞ。覚えておくと良い。

頂点プログラム固有の機能として、`ADDRESS`変数を用いた配列のインデックス指定や、`EXP`と`LOG`命令での高速な指数関数と対数関数の計算ができるんですね。

そうそう!`OPTION ARB_position_invariant;`を使うと、頂点変換をOpenGLに委譲してパフォーマンスを向上させることもできたんだ。賢いじゃろ?

フラグメントプログラムでは、`SIN`、`COS`、`SCS`命令で三角関数を計算したり、`TEX`、`TXP`、`TXB`命令でテクスチャサンプリングを実行したり、`KIL`命令でフラグメントを破棄したりできるんですね。

`LRP`命令で線形補間もできたぞ。RGBAコンポーネントを`r`、`g`、`b`、`a`の記号で指定できるのも便利だったな。命令に`_SAT`サフィックスを付けると、結果を0から1の範囲にクランプできたし。

NvidiaはARBアセンブリの仕様を拡張して、ジオメトリシェーダーやコンピュートシェーダーなどの現代的な機能を追加したんですね。すごい!

ARBアセンブリは、現代のシェーダープログラミングの基礎を理解するための重要な技術なのじゃ。SPIR-Vのような新しい技術にも、ARBアセンブリの概念が生かされているから、知っておいて損はないぞ。

勉強になりました!最大プログラム行列数が8、最大プログラム行列スタック深度が1、最大テクスチャ座標数が2、最大テクスチャイメージユニット数が2という制限があったんですね。

そうそう。色々制限はあったけど、工夫次第で面白い表現ができたんだぞ。しかし、ロボ子よ、最大テクスチャイメージユニット数が2って、今の時代から考えると、まるでガラケーみたいじゃな。

確かにそうですね(笑)。でも、その制約の中で創意工夫するのも、またエンジニアの腕の見せ所かもしれませんね。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。