2011-01-21 11 views
3

デプステストを使用する簡単なプログラムがあります。期待通りに動作しません。プログラムはX、Y軸と原点の近くの球を描画します。 GL_DEPTH_TESTをオンにしないと、球が軸の上に描画されます。 GL_DEPTH_TESTをオンにすると、軸は私が期待していない球の上に描画されます。誰かが私が何をしたのか教えてもらえますか 間違っていますか?OpenGLデプステストが正常に動作しない

void 
glwid::initializeGL() 
{  
    glClearColor (0.0f, 0.0f, 0.0f, 1.0f);  
} 



void 
glwid::resizeGL(int width, int height) 
{ 
    glViewport(0, 0, (GLint)width, (GLint)height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    gluPerspective (90, (GLint)width/ (GLint)height, 0.0, 200.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glEnable (GL_DEPTH_TEST); 
} 


void 
glwid::paintGL() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode (GL_MODELVIEW); 
    glLoadIdentity(); 

    gluLookAt (0, 0, 100, 0, 0, 0, 0, 1, 0); 


    // 
    // X axis 
    // 
    glBegin(GL_LINES); 
    qglColor(green); 
    glVertex3f (-100.0, 0, 0.); 
    glVertex3f (100.0, 0, 0.); 
    glEnd(); 


    // 
    // Y axis 
    // 
    glBegin(GL_LINES); 
    qglColor(red); 
    glVertex3f (0.0, 100.0, 0.); 
    glVertex3f (0.0, -100, 0.); 
    glEnd(); 

    // 
    // sun 
    // 
    glTranslated (5, 0, 20); 
    GLUquadricObj *sphere_quadric = gluNewQuadric(); 
    glColor3ub (255, 255, 0); 
    gluQuadricDrawStyle(sphere_quadric, (GLenum)GLU_SMOOTH); 
    gluSphere(sphere_quadric, 10, 36, 36); 
} 
+0

を置く方が良いでしょう。書式を修正します。 – orlp

+1

デプステストの有無にかかわらず写真を投稿できますか? – rotoglup

答えて

13

を行う必要があります。問題はresizeGL()の機能にあります。 問題は、あなたの3番目の引数として

gluPerspective (90, (GLint)width/ (GLint)height, 0.0, 200.0); 

0.0の値に入れていました。たとえば0.01を入力してください。すべてがOKです。このパラメータは常に正でなければなりませんので、それはです: http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml

(GLfloat)width/ (GLfloat)height(GLint)width/ (GLint)heightを変更それ以外の結果は奇妙になります。

そして、それは誰もがこのようにそれに答えるために行くされていないglEnable(GL_DEPTH_TEST)initializeGL()に機能

+2

glEnableは初期化に属しません。すべてのOpenGL状態は必要な直前に設定されます。 glEnable(GL_DEPTH_TEST)は、ジオメトリが描画される直前にpaintGLに属します。また、glViewport、投影行列と他のものを設定することはそこにあり、どこにも属しません。 – datenwolf

+0

私はresize()メソッドが良い場所ではないことを意味し、このプログラムではglEnable(GL_DEPTH_TEST)をどこにも変更されていないため、初期化するだけで十分です。しかし、世界的に正しいです – Andrew

+0

ありがとうアンドリュー、perpectiveパラメータが問題でした。 – tadpole

0

あなた軸はZ位置0球が(遠く「カメラ」から)Z位置20にあり、したがって軸にフロント球ので始まり、表示されています。

あなたが現在セットアップしているので、Z値が上がるにつれて画面から離れます。彼らが降りると、彼らは画面に近づきます。

次の2つの方法があります。軸を描いている間に深度テストを無効にする(したがって、常にすべての背後にある)。または、軸をZポジション100程度まで動かし、同じサイズに見えるようにスケールします。オプション1はおそらく良いでしょう。

は単にglDisable(GL_DEPTH_TEST);glEnable (GL_DEPTH_TEST);であなたの軸の描画ルーチンをラップすることは、私はあなたのコードを試してみたトリック

+0

カメラの位置は(0、0、100)です。軸の起点 - (0、0、0)球の中心 - (5、0、20)。 Axis is far – Andrew

+0

私はカメラの配置線を見逃しました。良いキャッチ。 –

+0

深さテストは自動的に動作する必要があります!ちょうどうまくいけば、有効/無効にするべきではありません! - これは手動でのオブジェクトソートと同じです - デプステストで必要なこと – Andrew

関連する問題