私は英語を母国語としないので、openGL wikiとwww.learnopengl.comのチュートリアルを読み込もうとすると、概念全体がどのように機能するかを直感的に理解できるようになることはありません。誰かがそれがどのように機能するかをより抽象的な方法で私に説明できますか?頂点シェーダーとフラグメントシェーダーとは何ですか?また、それらを何に使用しますか?
OpenGL wiki は良い定義を与えます:
シェーダーは、グラフィックプロセッサのあるステージで実行するように設計されたユーザー定義プログラムです。
以前は、グラフィックカードはプログラム不可能なシリコン片であり、一連の固定アルゴリズムを実行していました。
すべて、通常は https://en.wikipedia.org/wiki/Phong_reflection_model に沿って、単一の固定パラメーター化アルゴリズムを使用します。
しかし、それは多くの異なる複雑な視覚効果を作成したいプログラマーにとっては制限が多すぎました。
そのため、半導体製造技術が進歩し、GPU設計者が平方ミリメートルあたりより多くのトランジスタをクランプできるようになると、ベンダーはレンダリングパイプラインの一部をCのようなプログラミング言語にプログラムできるようになりました [〜#〜] glsl [〜#〜] 。
次に、これらの言語は 半文書化されていない命令セット に変換され、これらの新しいGPUに組み込まれている小さな「CPU」で実行されます。
少し前まで、シェーダー言語 チューリング完全ではありませんでした 。
汎用GPU(GPGPU)という用語は、最新のGPUのこの向上したプログラム可能性を指します。
OpenGL 4モデルでは、次の図の青いステージのみがプログラム可能です。
画像ソース 。
シェーダーは、前のパイプラインステージ(頂点の位置、色、ラスタライズされたピクセルなど)から入力を受け取り、次のステージへの出力をカスタマイズします。
最も重要な2つは次のとおりです。
名前shaderは、現在のアーキテクチャをあまり説明していません。GLSLの「シェーダー」は、OpenGL 4.3 GL_COMPUTE_SHADER
は言うまでもなく、頂点の位置も管理します。これにより、OpenCLのように、レンダリングとはまったく関係のない任意の計算が可能になります。
TODOは、OpenCLだけで効率的に実装できますか?つまり、すべてのステージをプログラム可能にしますか?もちろん、パフォーマンスと柔軟性のトレードオフが必要です。
シェーダーを備えた最初のGPUは、ワークロードがまったく異なるため、頂点シェーディングとフラグメントシェーディングに異なる専用ハードウェアを使用していました。ただし、現在のアーキテクチャでは、すべてのシェーダーに単一タイプのハードウェア(基本的には小さなCPU)を使用しているため、ハードウェアの重複をある程度節約できます。この概念は次のように知られています: https://en.wikipedia.org/wiki/Unified_shader_model
画像ソース 。
シェーダーとそのすべてを真に理解するには、多くの例を見てAPIを学ぶ必要があります。 https://github.com/JoeyDeVries/LearnOpenGL たとえば、良い情報源です。
最新のOpenGL4では、hello worldトライアングルプログラムでさえ、glBegin
やglColor
のような古い非推奨の即時APIの代わりに、非常に単純なシェーダーを使用します。次に例を示します: https://stackoverflow.com/a/36166310/895245
重要なシェーダーの古典的なクールなアプリケーションの1つは、動的シャドウです。
画像ソース 。
シェーダーは基本的に、いくつかの光の方程式に基づいて、レンダリングするオブジェクトの正しい色を提供します。したがって、球、ライト、およびカメラがある場合、球の色が1つしかない場合でも、カメラにはいくつかの影、いくつかの光沢のある部分などが表示されます。シェーダーは、これらの効果を与えるために光方程式の計算を実行します。
頂点シェーダーは、仮想空間(3Dモデル)内の各頂点の3D位置を、画面に表示される2D座標に変換します。
フラグメントシェーダーは基本的に、光の計算を行うことで各ピクセルのカラーリングを提供します。