Openglの光を理解しようとしている、現実的な太陽光をシミュレートする方法は?


13

何か間違ったことをしているのか、何かを逃しているのかはわかりませんが、晴れた日のように太陽光をシミュレートしたいです。

オブジェクトが指向性ライトに面している場合、オブジェクトは十分に明るく、問題はありません。オブジェクトを回って戻ってきたところを見ると、暗いです。使用しGL_AMBIENTているので暗すぎませんが、晴れた日には暗すぎます。値を大きくしても、オブジェクトの光に面する側が明るすぎるため、見た目が良くなりません。

また、アンビエントライトにはもう1つの厄介な問題があります。オブジェクトの背面を見ると、形が見えず、無地の色しか見えません。説明が難しい、ここにいくつかの写真があります:

オブジェクト前面:http : //i.stack.imgur.com/YW53X.png
オブジェクト背面:http : //i.stack.imgur.com/Qufha.png

簡単に見ることができるように、正面が見栄えが良く、その赤いものの形を見ることができます。裏面では、それはプレーンで、同じ形を見ることができません。

今、私はオブジェクトの後ろを見ていること、そして光の方向を見ていることを知っています、そしてそれは正面より暗いはずです。しかし、このように単純に見えるべきではありません。それは、あるオブジェクトを見て太陽光に逆らったときに見えるものではなく、オブジェクトが何らかの形を形成していることがわかります。

OpenGLで同じ(または同様の)効果を得るにはどうすればよいですか?

私の光は現在このように定義されています:

float posLight0[4] = {-1.0f, 1.0f, 1.0f, 0.0f};
float ambLight0[4] = {0.5f, 0.5f, 0.5f, 0.5f};

glLightfv(GL_LIGHT0, GL_POSITION, posLight0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambLight0);

可能であれば、シェーダーの使用を検討することをお勧めします。OpenGL固定機能パイプラインはかなり単純な照明モデルを使用しますが、シェーダーは数学を完全に制御できます。
信じられないほどの修道士

回答:


11

アンビエントライトでは、拡散光がアンビエントライトに追加され、デフォルトで拡散光が1.0に設定されるため、オブジェクトは明るすぎます。これは合計で1.5になり、1.0を超えるすべてがクランプされます。拡散光を0.5に設定します。

float difLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, difLight0);

2番目の問題は解決が困難です。テクスチャやバンプマップなど、表面に細かいディテールを追加してみてください。OpenGLでは周囲光は一定ですが、現実の世界ではそうではありません。実世界をシミュレートするには、何らかの形のグローバルイルミネーションソリューションが必要です。アンビエントオクルージョンはここで非常に役立ちますが、OpenGLの状態を設定するよりも実装が困難です。3Dモデリングソフトウェアでモデルの頂点にアンビエントオクルージョンをベイク処理するか、SSAOを使用できますが、詳細は説明しません。

簡単にできることは、他の方向(反対方向など)から別の調光光源を追加することです。これは現実的ではありませんが、少なくともオブジェクトの裏面にもある程度の形状を与えます。

アプリケーションに鏡面ハイライトを追加することも検討してください。オブジェクトを輝かせます。

float specLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specLight0);
glMaterialfv(GL_FRONT, GL_SHININESS, 10.0f); // Shininess between 0 and 128

特にデフォルトが適切でない場合は、ライトとマテリアルの色を別々に指定することもできます。


だから、OpengGLでやりたいことをする簡単で直接的な方法はありません...残念です。別の光源を追加してみますが、光の強度をどのように正確に指定しますか?
リカルドアマラル

しかしGL_SPECULARGL_SHININESS何の効果ももたらさないようです... コンパイルしていなかっglMaterialfvglMaterialiので、変更しました。そして、128のような大きな値も試してみました。それは私には同じように見えます...たぶん問題はロードされたモデル(obj / mtl)にあるので、調べてみる必要があります。
リカルドアマラル

1
@Nazgulled light0スペキュラーのデフォルトが1.0であるのをチェックしましたが、マテリアルスペキュラーのデフォルトは0.0です。glLightfv(GL_LIGHT0、GL_SPECULAR、specLight0)を変更します; to glMaterialfv(GL_FRONT、GL_SPECULAR、specLight0); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER、GL_TRUE)を設定することも良いです。または、カメラが回転しているときに鏡面反射光が誤って計算される場合があります。
-msell

1
@Nazgulledセカンダリライトの場合、周囲光と鏡面反射光をゼロに設定し、拡散光に対して0.2などの小さな値を設定します。すべてのライトのアンビエントをゼロに設定し、代わりにGL_LIGHT_MODEL_AMBIENTでグローバルアンビエントを使用することもできます。
-msell

2

OpenGLのアンビエントライトは単色ですが、現実世界のアンビエントライトは通常、上から明るく、下から暗いです。これをOpenGLで概算するには、環境光を非常に濃い青に設定し、下向きの濃い青の指向性光を追加します。それに加えて、太陽のあるところから来る明るい白色の指向性ライトは、屋外の光をかなりよく近似できます。

実際にすべきことは、ピクセルごとに光を計算するシェーダーを書くことですが、そこから到達するには少し時間がかかります。


1

あなたがここで得た答えはかなり良いです。1つだけ追加します。より良くしたい場合は、大気散乱を実装してみてください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.