ライティングは、コンピューター グラフィックスにおいて非常に複雑なトピックです。
もちろん、実際に重要なのはオブジェクトの照明であり、現実世界の照明やターゲットとする効果をエミュレートします。照明環境は、達成しようとしている実際の効果に近づけるために、多くのソースで構成することができます。
OpenGL ライティングの実装は動的ライトです。これは、レンダリングされた頂点 (三角形のレンダリングに使用される) に「光を当てる」(つまり、色を与える) ことを可能にするライト ポイントの抽象化です。...頂点が照らされ、各ライトの色の影響を取得します。
おっしゃったように、レンダリング プロセスには、有効にしたライトが増えるほど時間がかかります。これを最小限に抑えるには、さまざまな可能性があります。
- ライト カリング (色を変更するのにほとんど寄与しないライトを除外する)。これは、ライト プロパティ (距離、コーン、減衰、視点、および障害物) を使用して決定されます。
- テクスチャを使用して、動かないオブジェクトの照明をエミュレートする静的照明。
OpenGL 固定ライティングは頂点カラーに寄与し、三角形をラスタライズするために他の頂点カラーで補間されます。ジオメトリがいくつかの三角形で構成されている場合、各三角形の内側に光円錐は見えません。これは、そのフラグメントの色が 3 つの色 (3 つの頂点) の補間の結果であるためです。
より正確なライティングを実現するために、ソフトウェアは頂点がライトによって色付けされるのと同じ方法で各フラグメント (ピクセル) の色 (ピクセル ライティング) を決定しますが、理解できるように、頂点よりも多くのピクセルが存在する可能性があります。アプローチの 1 つは、(シェーダーまたは OpenGL 拡張機能を使用して) ラスター化フェーズ中にジオメトリの各ピクセルのライトの寄与を計算するか、ディファード ライティングを使用してピクセルの色を決定することです。
ディファード ライティングは、複数のテクスチャ (ビューポートに対応) を使用して、表示される各ピクセルのライト パラメータを保存します。このようにして、イメージが生成された後にライト計算を実行し、ジオメトリ ピクセルごとに 1 回ではなく、ピクセルごとに 1 回ライトの寄与を決定します。