web-dev-qa-db-ja.com

OpenGLのシェーダーとは何ですか?また、それらは何のために必要ですか?

私は英語を母国語としないので、openGL wikiとwww.learnopengl.comのチュートリアルを読み込もうとすると、概念全体がどのように機能するかを直感的に理解できるようになることはありません。誰かがそれがどのように機能するかをより抽象的な方法で私に説明できますか?頂点シェーダーとフラグメントシェーダーとは何ですか?また、それらを何に使用しますか?

19
Tommz

OpenGL wiki は良い定義を与えます:

シェーダーは、グラフィックプロセッサのあるステージで実行するように設計されたユーザー定義プログラムです。

以前は、グラフィックカードはプログラム不可能なシリコン片であり、一連の固定アルゴリズムを実行していました。

  • 入力:三角形の3D座標、それらの色、光源
  • 出力:2D画像

すべて、通常は https://en.wikipedia.org/wiki/Phong_reflection_model に沿って、単一の固定パラメーター化アルゴリズムを使用します。

しかし、それは多くの異なる複雑な視覚効果を作成したいプログラマーにとっては制限が多すぎました。

そのため、半導体製造技術が進歩し、GPU設計者が平方ミリメートルあたりより多くのトランジスタをクランプできるようになると、ベンダーはレンダリングパイプラインの一部をCのようなプログラミング言語にプログラムできるようになりました [〜#〜] glsl [〜#〜]

次に、これらの言語は 半文書化されていない命令セット に変換され、これらの新しいGPUに組み込まれている小さな「CPU」で実行されます。

少し前まで、シェーダー言語 チューリング完全ではありませんでした

汎用GPU(GPGPU)という用語は、最新のGPUのこの向上したプログラム可能性を指します。

OpenGL 4モデルでは、次の図の青いステージのみがプログラム可能です。

enter image description here

画像ソース

シェーダーは、前のパイプラインステージ(頂点の位置、色、ラスタライズされたピクセルなど)から入力を受け取り、次のステージへの出力をカスタマイズします。

最も重要な2つは次のとおりです。

  • 頂点シェーダー:
  • フラグメントシェーダー:
    • 入力:三角形のすべてのピクセルの2D位置+(エッジの色またはテクスチャ画像)+照明パラメータ
    • 出力:三角形のすべてのピクセルの色(別のより近い三角形によって遮られていない場合)、通常は頂点間で補間されます

名前shaderは、現在のアーキテクチャをあまり説明していません。GLSLの「シェーダー」は、OpenGL 4.3 GL_COMPUTE_SHADERは言うまでもなく、頂点の位置も管理します。これにより、OpenCLのように、レンダリングとはまったく関係のない任意の計算が可能になります。

TODOは、OpenCLだけで効率的に実装できますか?つまり、すべてのステージをプログラム可能にしますか?もちろん、パフォーマンスと柔軟性のトレードオフが必要です。

シェーダーを備えた最初のGPUは、ワークロードがまったく異なるため、頂点シェーディングとフラグメントシェーディングに異なる専用ハードウェアを使用していました。ただし、現在のアーキテクチャでは、すべてのシェーダーに単一タイプのハードウェア(基本的には小さなCPU)を使用しているため、ハードウェアの重複をある程度節約できます。この概念は次のように知られています: https://en.wikipedia.org/wiki/Unified_shader_model

enter image description here

画像ソース

シェーダーとそのすべてを真に理解するには、多くの例を見てAPIを学ぶ必要があります。 https://github.com/JoeyDeVries/LearnOpenGL たとえば、良い情報源です。

最新のOpenGL4では、hello worldトライアングルプログラムでさえ、glBeginglColorのような古い非推奨の即時APIの代わりに、非常に単純なシェーダーを使用します。次に例を示します: https://stackoverflow.com/a/36166310/895245

重要なシェーダーの古典的なクールなアプリケーションの1つは、動的シャドウです。

画像ソース

シェーダーは基本的に、いくつかの光の方程式に基づいて、レンダリングするオブジェクトの正しい色を提供します。したがって、球、ライト、およびカメラがある場合、球の色が1つしかない場合でも、カメラにはいくつかの影、いくつかの光沢のある部分などが表示されます。シェーダーは、これらの効果を与えるために光方程式の計算を実行します。

頂点シェーダーは、仮想空間(3Dモデル)内の各頂点の3D位置を、画面に表示される2D座標に変換します。

フラグメントシェーダーは基本的に、光の計算を行うことで各ピクセルのカラーリングを提供します。

17
jh314