NVIDIAのシェーダー言語とか その2

前回の続きです。

結局、NVIDIAの配布するライブラリ(Cg Toolkit)に依存してしまうけど、DirectX/OpenGLで共通のシェーダーソースコードを使用することが可能になります。Cg言語は HLSL と大分似ているのでコードは書きやすいと思われます。 OpenGLに純粋に従うのであれば、 GLSL にてシェーダーを記述することになりますが、DirectX版も用意しなければいけない環境だと HLSL & GLSL の2種類を書かなくてはいけなくなり、ちょっと手間です。

(HLSL2GLSLや HLSL2GLSLfolk といったトランスレータを用意して何とかのりきる手もあるにはあると思いますが)

そこで NVIDIAが用意している強力なOpenGL拡張があります。
GL_EXT_Cg_shader というものです。とても奇妙な、でも強力な拡張機能です。
現時点ではほとんど情報が出てこないので、このブログでちょっと取り上げてみようと思った次第です。

この機能で何ができるかを列挙します。

  • GLSLにはないが、Cg言語で備えている組み込み関数が GLSLで使用できる。litとかlerpとか。
  • #include ディレクティブが使える
  • vec2,vec3といったGLSLの型の代わりに、HLSL(Cg)の float2, float3 といった馴染みの型が使用できる
  • GLSLシェーダーソースコードの代わりに、Cgシェーダーソースコードを渡してOpenGLのシェーダーを生成できる

一番最後の項目が、とっても奇妙で、すごすぎる機能です。
NVIDIA限定とはいえ、CgランタイムなしでCgコードをコンパイルできるわけですから。
これを前提とすれば、ほぼHLSLで書いておけば、OpenGL版に移行するときも楽ちんということです。

あとは、#include でしょうか。 「GLSLには #include がない!」とはよく騒がれたりする人がいるようですし。これが使えるという点は、結構大きなポイントかもしれません。

なお、使い方は簡単で、
glCreateShader 関数の引数に、GL_VERTEX_SHADER / GL_FRAGMENT_SHADER を渡す代わりに、
GL_CG_VERTEX_SHADER, GL_CG_FRAGMENT_SHADER をセットして、Cg言語で記述されたソースコードを与えてあげるだけです。

※ わかりにくいという指摘がありましたので、修正しました。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする


コメント

  1. omochi より:

    こんにちは

    前記事
    >Cg Toolkitという名前でランタイムとツールとを用意していて、これを用いればNVIDIAだけに限らず AMD RadeonでもCg言語を用いたシェーダーを使えるようだ。

    この記事
    >結局、Cg runtimeが使えるなら、これを使ってしまえば、DirectX/OpenGLで共通のシェーダーソースコードを使用することが可能になります。NVIDIA依存してしまうけど、Cg言語は HLSL と大分似ているのでコードは書きやすいと思われます。

    矛盾しているようでよくわかりませんが、
    結局、AMD RadeonではCgは使えないと言うことでしょうか?

  2. slash より:

    こんにちは。

    確かにわかりにくい感じの文章になってしまいました。
    この点、申し訳ありません。

    結論からいうと、RADEON でも Cgは使用可能のようです。
    NVIDIA依存してしまうけど、というのはボードという意味ではなく、NVIDIA提供のCg Runtimeに依存という意味で、NVIDIAというメーカーの提供物に依存という意味合いで書きました。

    NVIDIAがCg Toolkitを更新しなくなったり、配布をやめたりすると
    使えなくなってしまう点は、リスクだということです。

  3. omochi より:

    わざわざ記事修正して頂き、ありがとうございます。
    良くわかりました :mrgreen: