1

3D エンジンにライティングを実装していますが、ライティングの計算方法に問題があることを発見しました。コンバイン シェーダーでは、ディフューズ カラーとライティングの計算を取得します。

return diffuseColor * (diffuseLight + ambient);

私が知る限り、これが標準的なやり方です。しかし、たとえば、色が 0,1,0 で、光が 1,0,0 の場合はどうでしょうか。(この例ではアンビエントを無視します) 結果は 0,0,0 になります。しかし実際には、純粋な緑色の紙切れに赤みを帯びた光を当てると、黄色に変わるはずです。または、少なくとも黒ではありません。

他のゲームはこの問題をどのように解決しますか?

4

2 に答える 2

2

緑色の紙は赤色光を吸収し、黄色ではなく黒色に見えます。追加とは、白い紙を赤と緑の光で照らすことを意味します。その後、紙は黄色に見えます。

http://www.physics.wisc.edu/museum/Exhibits-2/Light_Optics/ColorObj/Color_index.html

于 2012-05-25T08:25:54.037 に答える
0

それは(RGBコンポーネントごとに)あるべきです

return (diffuseColor * diffuseLight) + ambient;

アンビエント コンポーネントは定数であり、他のすべてのライティング計算が行われた後に追加され、ライトの方向や視線方向に依存しません。

フリオが言うように、純粋な緑色の紙は、純粋な赤い光の下では黒く見えます.

何かが緑色に見えるのは、スペクトルから他のすべての色を吸収し、残ったもの (つまり緑色) が反射されるためです。赤い光を当てると、緑は反射しません。

于 2012-05-25T09:35:03.907 に答える