0

あはは!私の問題は、gluPerspective に与えられた zNear 値が 0 よりも大きくなければならず、それを機能させるために深度バッファーを有効にする必要があったようです。以下のコードが機能するように更新しました。

私はこれを何度もやろうとしましたが、クワッド頂点を間違った順序で定義しているといつも思っていましたが、今では別のことを知っています.

Culling を有効にし、frontFace を時計回りに変更し、Blending を無効にし、法線を追加しようとしましたが、常にこのような立方体が得られます。

立方体がどのように見えるか

このように理解するのはそれほど難しくなかったので、問題が何であるかを知るために私のコードを見る必要さえないことを願っています.

問題が何であるかすぐにわからない場合は、立方体を設定して描画するために使用されるコードを次に示します。

// FIXED CODE.
// reshape, called on init, and window resize
void reshape(int w, int h) {
     scrw=w;
     scrh=h;
     glClearColor(0.8,0.8,0.8,1.0);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     gluPerspective(cfov,(float) scrw/ (float) scrh,1,1000); // this is also a part of the fix.
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
     glEnable(GL_BLEND);
     glEnable(GL_DEPTH_TEST); // this is a part of the fix
     glEnable(GL_CULL_FACE);
     glCullFace(GL_FRONT);
     glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
     glViewport(0,0,scrw,scrh);
}
// drawQuadCube(), called every frame.
void drawQuadCube() {
     glPushMatrix();
     glTranslated(0.5,0.5,0.5);
     glRotated(xangle,0,1,0);
     glRotated(yangle,1,0,0);
     glRotated(zangle,0,0,1);
     glTranslated(-0.5,-0.5,-0.5);
     glBegin(GL_QUADS);
               //   bottom
               glColor4ub(30,30,255,255);
          glVertex3f(0.0f, 0.0f, 1.0f);
          glVertex3f(1.0f, 0.0f, 1.0f);
          glVertex3f(1.0f, 0.0f, 0.0f);
          glVertex3f(0.0f, 0.0f, 0.0f);
               //   top
               glColor4ub(40,40,255,255);
          glVertex3f(0.0f, 1.0f, 1.0f);
          glVertex3f(1.0f, 1.0f, 1.0f);
          glVertex3f(1.0f, 1.0f, 0.0f);
          glVertex3f(0.0f, 1.0f, 0.0f);
               //   left
               glColor4ub(60,60,255,255);
          glVertex3f(0.0f, 0.0f, 1.0f);
          glVertex3f(0.0f, 0.0f, 0.0f);
          glVertex3f(0.0f, 1.0f, 0.0f);
          glVertex3f(0.0f, 1.0f, 1.0f);
               //   right
               glColor4ub(60,60,200,255);
          glVertex3f(1.0f, 0.0f, 1.0f);
          glVertex3f(1.0f, 0.0f, 0.0f);
          glVertex3f(1.0f, 1.0f, 0.0f);
          glVertex3f(1.0f, 1.0f, 1.0f);
               //   near
               glColor4ub(70,70,100,255);
          glVertex3f(0.0f, 0.0f, 0.0f);
          glVertex3f(1.0f, 0.0f, 0.0f);
          glVertex3f(1.0f, 1.0f, 0.0f);
          glVertex3f(0.0f, 1.0f, 0.0f);
               //   far
               glColor4ub(20,20,90,255);
          glVertex3f(0.0f, 0.0f, 1.0f);
          glVertex3f(1.0f, 0.0f, 1.0f);
          glVertex3f(1.0f, 1.0f, 1.0f);
          glVertex3f(0.0f, 1.0f, 1.0f);
          glNormal3f(0,0,0);
          glNormal3f(0,0,1);
          glNormal3f(0,1,0);
          glNormal3f(1,0,0);
          glNormal3f(1,0,1);
          glNormal3f(1,1,0);
          glNormal3f(1,1,1);
          glNormal3f(0,1,1);
     glEnd();
     glPopMatrix();

}
// if that isn't enough, this is the function used to set up the view.
void setView(void) {
     glLoadIdentity();
     gluLookAt(0.5,0.5,-5,0.5,0.5,0.5,0,1,0);
}
4

3 に答える 3

1

巻き取りモードが正しくありません。

glFrontFace のデフォルトは GL_CCW ですが、「正面向きのクワッド」、この例では「近い」ものは時計回りに巻かれています (カメラ位置の基準フレームから; 負の Z にあり、正の Z に沿っていることに注意してください)。 . glCullFaceデフォルトは GL_BACK であるため、選別されています。次のように正しく設定します。

glFrontFace(GL_CW);

http://www.opengl.org/sdk/docs/man/xhtml/glFrontFace.xmlも参照してください。

セットアップが完了したら、深度バッファリングを有効にして、ペイントの順序に依存せずにクワッドが正しくオーバーペイントされるようにします。参照: http://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm

于 2013-01-27T21:26:02.347 に答える
0

試す:

 glCullFace(GL_FRONT);

http://www.opengl.org/sdk/docs/man/xhtml/glCullFace.xmlを参照してください。

また:

glEnable(GL_CULL_FACE);

http://www.opengl.org/sdk/docs/man/xhtml/glEnable.xmlを参照してください。

于 2013-01-27T21:19:29.080 に答える