NVIDIAはHLSLによく似たCgというシェーダー言語をサポートしている。
Cg Toolkitという名前でランタイムとツールとを用意していて、これを用いればNVIDIAだけに限らず AMD RadeonでもCg言語を用いたシェーダーを使えるようだ。
このCgは非常に検索性が悪い(笑)ので何とかしてほしいところですね。”Cg”って用語がもはや一般的すぎて・・・。
で、NVIDIAのボード環境に限っていえば、HLSL, Cg, GLSL と3種類のシェーダー言語をサポートしていることになります。
DirectX なら HLSL、OpenGLならGLSLといった具合に。Cgはどちらの環境でも使えるようにランタイムがきちんと整備されている。NVIDIA環境ならCgをつかっておけば問題ないという感じ。
そういえば、PS3の環境も Cg を使っているんだっけ。
今回はこの3言語をNVIDIAがサポートしている点でのお話です。
NVIDIAはこの複数の言語をサポートするために、Unified Compiler Architecture (UCA) という構造をとっているようです。これは、どの言語であれ同じコンパイラエンジンを通ることになり、出てくる結果もほぼ同じようなものに仕上がるということだと推測される。Microsoftの VisualBasic.NetやC#らで作った成果物が MSIL として出てくるのと同じなんじゃないかと思う。
このおかげで複数のエンジンを積まず、シンプルさをある程度維持しつつ、複数の言語をサポートできるのだと思う。そもそも GLSLはドライバ内部にシェーダーコンパイラを持つことを要求されているので、そこにCg用が入っていたとしてもなんの問題もなく、むしろ合体させてしまうのは都合がいいことだろう。
個人的には、OpenGLのこの仕組みはあまり好きではないですが。DirectXのように一度、共通のバイナリ化してほしい。シェーダーのソースコードは確かにプラットフォームを越えて持って行きやすいが、中身がそのまま見えてしまうのはうれしいことではなかったりするので。4.1のBinaryShaderの拡張も、ベンダー依存のバイナリが出てくるようなので、この点については望み薄のような気がします。
NVIDIAが3つのシェーダー言語をサポートしているという点と、構造を話したところで、続きはまた次回に。