2026年7月23日木曜日

GLSLは誕生時からvoid main()を唯一の入口として固定し、C言語に近い統一的な実行モデルを採用した

 シェーダープログラミングにおける「入口関数が一つ存在する」という設計は、一見するとHLSLやGLSLによって突然導入されたように見える。しかし、その思想は1980年代の映画用レンダリング言語まで遡ることができる。RenderMan Shading Languageでは、surfacelightなどのシェーダー自体が一つの実行単位であり、各シェーディング点に対して独立に評価される構造を持っていた。これは現在のフラグメントシェーダーと本質的に同じ「多数のデータに対して同一の処理を適用する」というSIMD的発想である。一方、1990年代末のGPUでは、テクスチャコンバイナやRegister Combinersによって固定回路を組み合わせる方式が主流であり、プログラムというより配線に近いモデルであった。その後、DirectX 8やOpenGL ARB_fragment_programではアセンブリ形式の命令列が導入され、GPUを命令列で制御できるようになったが、この段階ではまだ入口関数という概念は存在せず、ファイル全体が一つのプログラムとして先頭から実行された。転機となったのは2002年前後のCgおよびHLSLであり、GPUプログラムがC言語風の構文を持つ高水準言語へと抽象化されたことで、関数・型・構造体を備えたソフトウェア的な設計が可能となった。HLSLでは入口関数名は任意であり、コンパイル時に指定される。一方、GLSLは誕生時からvoid main()を唯一の入口として固定し、C言語に近い統一的な実行モデルを採用した。したがって、「mainが一つ」という現在のGLSLの様式は、レンダリングアルゴリズムの進化というより、GPUを一般的なプログラミング対象へと昇華する過程で生まれた言語設計上の到達点と位置付けることができる。関連キーワード

  • RenderMan Shading Language (RSL)
  • REYES
  • Texture Combiner
  • Register Combiners
  • NVIDIA Cg
  • HLSL
  • GLSL
  • ARB_fragment_program
  • Pixel Shader
  • Fragment Shader
  • GPU Assembly
  • Shader Model
  • OpenGL 2.0
  • DirectX 9
  • エントリーポイント
  • main() 関数
  • SIMD
  • データ並列処理
  • 高水準シェーディング言語
  • プログラマブルGPU