1

私は現在、照らされた3Dシーン内の特定の顔の最終的なフラットカラー値を取得する方法に関する情報を探しています。次の4色を含むMaterialクラスがあります。

アンビエント、スペキュラー、ディフューズ&エミッション

私のColorクラスには、add、multiplyなどの単純なブレンド効果のメソッドがあります

ライト、カメラの位置、素材、顔の法線、顔の位置のリストから。標準の4色マテリアルモデルを使用したソフトウェアレンダリングパイプラインを使用して、塗りつぶされる面の最終的な色を計算したいと思います。

4

2 に答える 2

3

固定機能GLでも使用される標準のPhongまたはBlinn-Phong照明モデルが必要だと思います。

放射性の用語は、マテリアルがそれ自体で放出する色です(たとえば、ライトをモデリングする場合)。つまり、最終的な色に追加されるだけです。

color = emissive;

周囲項は、無限に反射された光による間接照明の計算をシミュレートするため、光の位置に依存せず、ほぼすべての場所に存在します。したがって、マテリアルのアンビエントはライトの色で乗算され、最終的な色に追加されます。

color += ambient * lightColor;

拡散項は、すべての方向に均等に光を反射する標準のランバート反射をシミュレートします。これは、光の方向と表面の法線との間の角度に依存し、角度が小さいほど光が多くなります。

lightDir = normalize(lightPos-facePos);
color += dot(lightDir, normal) * diffuse * lightColor;

鏡面反射用語は、最終的に、より多くの光を単一の方向(完全な反射方向)に反射する鏡面反射面をシミュレートします。したがって、顔を見ている方向によって異なります。さらに、反射率は、表面の粗さ(または実際にはGLが使用する名前でもあるその光沢)を表す別のパラメータに依存します。値が大きいほど、ハイライトがシャープになります。より「光沢のある」)。

viewDir = normalize(cameraPos-facePos);
halfVec = normalize(lightDir+viewDir);
color += pow(dot(normal, halfVec), shininess) * specular * lightColor;

もちろん、周囲光、拡散反射光、鏡面反射光の項は、すべての光について計算する必要があります。

距離減衰のない単純なポイントライト以外のより複雑なライトについては、他のことを考慮する必要がありますが、この単純なモデルで始めることができます。

于 2011-08-14T15:25:44.593 に答える
1

色はちょうど一緒に追加されます:

ambient + diffuse + emissive + specular

アンビエントはベースカラーです。ディフューズは、マテリアルの色に照明の強度を掛けたものです。エミッシブは、グローバルイルミネーションのような錯覚を作り出すために追加されたものです。最後の1つは、鏡面照明の計算結果によって多重化された鏡面色です。

したがって、次のようになります。

ambientcolor + diffusecolor * diffuselighting + emissivecolor + specularcolor * specularlighting

私の経験では、これは必ずしもあなたが望む照明モデルではありません。これらの色に異なる色相を指定すると、不自然な照明動作が発生しますが、OpenGlおよびDirectXの固定関数パイプラインのモデルはこのように機能します。

于 2011-08-14T15:16:41.160 に答える