2

画面に glutSolidCube と glutSolidTeapot を描画します。

glEnable(GL_CULL_FACE) をアクティブにするたびに、オブジェクトごとに異なる結果が得られます。立方体を適切に表示する (glCullFace(GL_BACK)) か、ティーポットを表示する (glCullFace(GL_FRONT)) ことができますが、両方を取得することはできません。

カリングを無効にすると、両方とも適切に表示されますが、有効にしたいと思います。

私が定義した他のオブジェクトも適切に表示されていません。

これらのオブジェクトは GLUT で定義されているので、法線の問題ではないと推測できますか?

効果の画像を示します。 ここに画像の説明を入力

光の定義:

void setLighting(void) {

//setMaterial();
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);

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

//diffuse light color variables
GLfloat dlr = 1.0;
GLfloat dlg = 1.0;
GLfloat dlb = 1.0;

//specular light color variables
GLfloat slr = 1.0;
GLfloat slg = 1.0;
GLfloat slb = 1.0;


//light position variables
GLfloat lx = 0.0;
GLfloat ly = 100.0;
GLfloat lz = 100.0;
GLfloat lw = 0.0;


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
GLfloat LightPosition[] = {lx, ly, lz, lw}; //set the LightPosition to the specified values



GLfloat global_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
glEnable(GL_LIGHTING);

glLightfv (GL_LIGHT0, GL_DIFFUSE,   DiffuseLight); //change the light accordingly
glLightfv (GL_LIGHT0, GL_AMBIENT,   AmbientLight); //change the light accordingly
glLightfv (GL_LIGHT0, GL_SPECULAR,  SpecularLight); //change the light accordingly

glLightfv (GL_LIGHT0, GL_POSITION,  LightPosition); //change the light accordingly
    }

デプス テストとカリングの有効化:

    glEnable(GL_DEPTH_TEST);    // Enable the depth buffer
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Ask for nicest perspective correction

glEnable(GL_CULL_FACE);     // Cull back facing polygons
    glCullFace(GL_BACK); 
4

5 に答える 5

2

深度バッファリングが悪いようです。

あなたは、

  1. 適切な解像度の深度バッファを要求しますか? (32ビットのようなもの)
  2. GL_DEPTH_BUFFER_BIT を gl_clear に渡す
  3. より良い解像度を得るために、ニア クリッピング プレーンとファー クリッピング プレーンの間の距離を作ってみましたか?

定義済みのオブジェクトと過剰ティーポットについて投稿した部分は知っていますが、過剰ティーポットには確かに反時計回りの頂点ワインディングがあるため、カリングをオンにしても表示されないという事実は、深度バッファーを考えさせます。

于 2012-05-02T20:44:51.147 に答える
1

単純な面のカリングは、頂点の順序に基づいています。つまり、最終的に画面空間で時計回りになるか反時計回りになるかです。したがって、問題は頂点の定義順序にある​​可能性があります。または、順序を反転する何らかの変換を適用している可能性があります (たとえば、負のスケーリング)。法線はライティングでのみ役割を果たします。

于 2012-05-02T11:17:10.180 に答える
0

このステートメントは奇妙に思えます:

glEnable(GL_CULL_FACE) をアクティブにするたびに、オブジェクトごとに異なる結果が得られます。立方体を正しく表示する (glCullFace(GL_BACK)) か、ティーポットを表示する (glCullFace(GL_FRONT)) ことができますが、両方を取得することはできません。

これには、次の 2 つの説明が考えられます。

  1. GLUT にバグがあるか、または (偶然に?) Z 軸を交換しました (たとえば、ニア クリッピング プレーンとファー クリッピング プレーンにすべて負の距離を使用するなど)。

  2. 前面の巻き方向を切り替えました( を呼び出しますglFrontFace

私が定義した他のオブジェクトも適切に表示されていません。

前面は、スクリーン スペースの頂点ワインディングによって決定されます。頂点は、画面上で時計回りまたは反時計回りに並べられます。デフォルトでは、OpenGL は、頂点が反時計回りに描かれた面を前面と見なします。これには法線は考慮されません。

これを修正する最も簡単な方法は、頂点を送信する順序を入れ替えることだと思います。

于 2012-05-02T13:00:50.903 に答える