私は C++ と OpenGL (glDrawPixels) を使用してレイ トレーサーに取り組んでおり、これまでのところうまくいっています。ただし、私のシェーディングは少しずれているようです。強度間に露骨な線を入れずに、球を少し滑らかに見せたいです。現時点では、強度 = Id * pd * (N dot L) であるランバート シェーディングを実装しようとしています。法線ベクトルと光ベクトルを正規化して (N dot L) を計算する必要があることはわかっていますが、Id と pd (強度拡散と比例係数) はどうですか? 次のことを達成するために、定数値 2.5 を使用しています。
明らかに、2.5 は完全に恣意的なものであり、他の試みが適切なシェーディングにさえ似ていなかったので、私はそれを使用しているだけです。上記の式は、色に強度を掛けるべきであることを示唆しているようです。これは私の方法です:
Color simpleIlluminate(Vector3D normal, Vector3D light, Color color) {
float intensity = dotProduct(normal, light)*2.5f;
color = Color((unsigned int)intensity*color.r, (unsigned int)intensity*color.g, (unsigned int)intensity*color.b);
return color;
}
法線ベクトルと光ベクトルが正しいと仮定します。Color は、RGB 値ごとに unsigned int を持つ、私が作成した単なる色の構造体です。パラメータ Color color は、シェーディングしたい球の色です。たとえば、red = Color(255,0,0) です。色の強度を変更するには、各値に計算した強度を掛けるだけですが、実行すると正しく表示されません。
誰かが私が欠けているものを説明し、ベクトルと球の色が与えられたときに正しい関数がどのように見えるべきかを教えてもらえますか? 私はいたるところを見てきましたが、良い解決策が見つかりません。float から unsigned int への変換が間違っている可能性もありますが、よくわかりません。どんな助けでも大歓迎です。