4

今日私に起こったことの 1 つは、OpenGL が GL_SHININESS マテリアル コンポーネントを 0.0 から 1.0 の間ではなく、0.0 から 128.0 の間で指定していることです。

私の知る限り、浮動小数点値を使用して指定できる他のすべての値の範囲は 0.0 から 1.0 です。GL_SHININESS との違いの理由は何ですか?

編集:

以下に投稿された新しい回答の私のメモも参照してください。

0.0 から 1.0 の範囲は意味がありません。これは、照明モデルが構築される方法のためです。光沢係数は指数として使用されます。[0.0, 1.0] の範囲の y に対して x^y を上げることは、ライティング モデルではあまり意味がありません。三角余弦関数) 三角分布をこれ以上厳密に制約することはできません。厳密に制約を緩和することしかできません。

私がここで行ったよりもこれをよりよく説明する良い参考文献は次のとおりです。

  • Interactive Computer Graphics - Angel と Schreiner によるシェーダーベースの OpenGL によるトップダウンアプローチ

  • OpenGL プログラミング ガイド、バージョン 4.3

以下の回答も非常に有益です。

数年前にこの質問をしたとき、おそらくその後、「値が 0.0 から 1.0 の範囲にないのに、この値が指数の新しい値にマッピングされたのはなぜですか?」と尋ねたと思います。これは別の良い質問です。おそらく、これは指数マップになるでしょう: y = exp(kx), x in [0.0, 1.0]. 答えは「そのように設計されていないため」です。これは「ブラック ボックス」の観点からはより有用かもしれませんが、現実的な材料モデルを実装することを期待して何らかの実験で指数を測定した科学者にとってはあまり有用ではありません。

4

3 に答える 3

9

ほとんどの単純なライティング モデルでは、スペキュラ ハイライトの明るさは次のように計算されます。cos(theta) ^ nここthetaで、 は入射角、nは光沢の値です。

GL_SHININESSその指数です。値が高いほど、ハイライトが「きつく」なります。

私見、式を知っている人にとっては、0..1の範囲で「正規化された」値を使用しようとするよりも、与えられた値をそのまま使用する方が単純に直感的です.

于 2013-07-18T14:11:38.387 に答える
2

以前に作成したコメントに自分のコメントを追加します。

OpenGL 光沢係数は、鏡面反射係数が cos^alpha(beta) によって計算される照明モデルの指数で使用されます。ここで、alpha = GL_SHININESS 係数であり、beta は反射法線方向とカメラ方向の間の角度です (モデルビュー行列数学の OpenGL カメラ モデルの解釈で)。

1.0 より大きい値を指定すると、より「厳密に制約された分布」または反射光の円錐が得られます。なぜ正確に 128.0 が最大値なのですか? おそらく、うまく機能する値だからです。1.0 のオーダーの数値と比較して、このオーダーの数値を使用する場合、観測可能な効果に大きな違いはありません。OpenGL 標準委員会は 1024.0 または 64.0 (など) を選択できたと思いますが、その違いはそれほど重要ではありません。

于 2015-10-12T23:01:25.750 に答える