2012-05-02 12 views
2

glutSolidCubeとglutSolidTeapotを画面に描画します。OpenGLのFace Cullingが正しく機能しない

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

カリングを無効にすると、両方が正しく表示されますが、有効にしたいと考えています。

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

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

Iは効果のイメージを示す: enter image description here

ライト定義:

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); 

答えて

1

単純顔カリングの順に基づいています頂点はスクリーン空間で時計回りに終わるか反時計回りに終わるかにかかわらず。したがって、問題は頂点の定義順にある場合もあれば、順序を反転させる何らかの変換(ネガティブスケーリングなど)を適用している場合もあります。法線は照明の役割しか果たしません。

+0

大丈夫ですが、ティーポットはスケールしません。 glutパッケージが付属していますが、キューブと同じ順序で定義してはいけませんか? –

+0

@kelmer:はい、私はそれらがあると思います。ティーポットが大丈夫になったら、キューブが内側になっているとどうして分かりますか?照明に基づいている場合、シーンにはどのようなタイプの光がありますか? – darklon

+0

キューブを連続的に回転させ、照明のために表示します。私は私のライトの定義を示すためにOPを編集しました。 –

1

この文は奇妙に思える:

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

あり、このための2つの可能な説明です:

  1. はどちらかあなたのGLUTはバグがある、またはあなたが(?誤って)近くのためのすべての負の距離を使って、例えば(Z軸を入れ替えてきたし、遠いクリッピング面)。

  2. は、あなたは私で定義された

その他のオブジェクトが正しくどちらか示されていない前面巻き方向(glFrontFaceに呼び出しを)切り替えます。

フロントフェイスは、スクリーンスペースの頂点ワインディングによって決まります。頂点は、時計回りまたは反時計回りのいずれかで画面上で並びます。デフォルトでは、OpenGLはその頂点を反時計回りの順番で前面として描画された面を想定しています。ノーマルは考慮されていません。

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

+0

おそらく自分自身で定義されたオブジェクトは間違って定義されているかもしれませんが、ティーポットは何も触れていないか、glFrontFaceを呼び出しました。私は、あなたが "近距離と遠方のクリッピング平面にすべての距離を使用する"という意味をよく理解していません。私はこれらをそれぞれ0.1と1000と定義しました。 –

+0

"私は間違いなく単語" - 私はすべての**マイナス**の距離を意味しました。 0.1と1000は非常に悪い選択ですが、深刻なバッファ深さの分解能を与えるでしょう。できるだけシーンに合ったものを選んでください。 – datenwolf

2

あなたの深さのバッファリングが悪く見えます。

あなた、

  1. は、十分な解像度のデプスバッファを要求しますか? (32ビットのようなもの)
  2. gl_clearにGL_DEPTH_BUFFER_BITを渡します。
  3. より良い解像度を得るために、近位と遠方のクリッピングプレーンの距離を作ろうとしましたか?

私は定義されたオブジェクトとglutティーポットについて投稿した部分を知っていますが、glutティーポットにはCCW頂点がありますので、カリングをオンにすると表示されません私は深さのバッファと思う。

+0

1)はい2)はい3)大きなオブジェクトがあるので、距離を0.1から1000に設定します。それを少し減らしてみましたが、喜びはありません。 おそらく、私がGLFWを使用していることを知るのに役立ちます。 –

+0

私は自分のものにもGLFWを使用します。私はそれが大好きです。まあ、私の推測を破ってしまうのですが、副次的なメモは、通常は1000よりもはるかに小さい間引き距離を使って周りを回ることができます。例えば、単純なことから、多くのエンジンは1.0fを1メートルと表します。したがって、1000.0fの間引き距離距離によっては1キロメートルを見ることができますが、これはアプリケーションによっては必要ではないかもしれません。 –

関連する問題