4

2 つの単純なオブジェクト (glutSolidCube と glutSolidTeapot) を持つ openGL 3d シーンがあります。GL_COLOR_MATERIAL を有効にしてライトを設定すると、次の結果が得られます。

ここに画像の説明を入力

どっちがいい。次に、次のように独自のマテリアルを設定すると:

//diffuse light color variables
GLfloat dlr = 0.4;
GLfloat dlg = 0.6;
GLfloat dlb = 0.9;

//ambient light color variables
GLfloat alr = 0.7;
GLfloat alg = 0.7;
GLfloat alb = 0.7;

//ambient light color variables
GLfloat slr = 0.4;
GLfloat slg = 0.4;
GLfloat slb = 0.4;


GLfloat DiffuseLight[]  = {dlr, dlg, dlb}; //set DiffuseLight[] to the specified values
GLfloat AmbientLight[]  = {alr, alg, alb}; //set AmbientLight[] to the specified values
GLfloat SpecularLight[] = {slr, slg, slb}; //set AmbientLight[] to the specified values

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&AmbientLight);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&DiffuseLight);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float *)&SpecularLight);

この非常に異なる結果が得られます。適切にシェーディングされていないことがわかります。SMOOTH (Gouraud) と定義しましたが、フラット シェーディングのようです。

ここに画像の説明を入力

問題はどこにありますか?それは材料定義にありますか?

4

2 に答える 2

5

specular shininessを設定するのを忘れました。

glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 12.0f);

10 ~ 25 に設定すると、見た目がずっと良くなり、光沢が増します。ただし、ピクセルごとの照明ほど見栄えはよくありません。光沢のデフォルト値は 0 で、見た目とまったく同じように見えます。

于 2012-05-02T13:33:12.867 に答える
1

この非常に異なる結果が得られます。適切にシェーディングされていないことがわかります。SMOOTH (Gouraud) と定義しましたが、フラット シェーディングのようです。

スムーズなシェーディングが得られました。ただし、OpenGL 固定関数パイプラインは、頂点でのみ照明値を評価し、面に対して重心補間を実行します。得られた結果はまさに期待どおりです。

必要なのは、ピクセル/フラグメント イルミネーションごとです。これを取得する唯一の方法は、シェーダーを使用することです (まあ、いわゆる「テクスチャ コンバイナー環境」をいじることによっても可能ですが、それを適切に機能させるのは大変な作業です。フォン イルミネーション シェーダーの実装は問題です。分)。

ライティングとマテリアルの設定を変更することで、グーロー シェーディング モデルの欠点を強調するだけです。

于 2012-05-02T13:19:23.920 に答える