2012-02-13 8 views
0

通常のglColor4f()を使って2つの異なるオブジェクトをレンダリングしようとしています。シーンには、面が均等に分割された巨大な平面と、平面よりも小さい中央の単純なキューブがあります。飛行機によって半分に分けられた。Opengl:透明度とデプステストの問題

問題1:私は周りのビューを回そうとすると、キューブは完全に平面の上にあるようです。エッシャーのように見えます。デプステストを正しく行うにはどうすればいいですか?

問題2:小さなキューブは透明で、スルータイプと見なされますが、透明度は機能しません。

私の初期設定方法。

void GWidget::initializeGL() 
{ 
    setFormat(QGLFormat(QGL::DoubleBuffer|QGL::DepthBuffer|QGL::Rgba|QGL::DepthBuffer)); 


    glEnable(GL_POINT_SMOOTH); 
    glEnable(GL_LINE_SMOOTH); 
    glEnable(GL_POLYGON_SMOOTH); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_CULL_FACE); 
    glEnable(GL_COLOR_MATERIAL); 

    glEnable(GL_ALPHA_TEST); 
    glAlphaFunc(GL_GREATER, 0.0f); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA,GL_SRC_ALPHA); 

    glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); 
    glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST); 
    glHint(GL_POINT_SMOOTH_HINT,GL_NICEST); 

    glCullFace(GL_BACK); 
    glDepthFunc(GL_LEQUAL); 
    glDepthMask(GL_TRUE); 

    glFrontFace(GL_CCW); 

     glMatrixMode(GL_MODELVIEW); 
     glTranslatef(0,0,-1); 
     glClearColor(0.4,0.5,0.4,0); 
     glClearDepth(1.0f); 
     glPushMatrix(); 
     glShadeModel(GL_SMOOTH); 
     glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); 

     glEnable(GL_MULTISAMPLE); 

//  glScalef(0.1f,0.1f,0.1f); 

} 

サイズ変更方法:ObjectXクラスの

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

    glOrtho (-width,width,-height,height, 0.0, 200.0); 
    glPushMatrix(); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0,0,-3); 
    glScalef(0.7,0.7,0.7); 
    glPushMatrix(); 
    glEnable (GL_DEPTH_TEST); 
} 

ドロー法:(平面)DomainX方法の

void ObjectX::GDraw(int i) 
{ 
    qint32 count,iter; 
    MeshX *dmesh; 
    VertX *dvert; 
    EdgeX *dedge; 
    FaceX *dface; 

    QList<VertX* > *vlist; 


    dmesh=this->Meshes[i]; 
    vlist=dmesh->getVList(); 

    iter=0; 
    int a,b; 
    int c,d; 
    glColor4f(0.81,0.71,0.51,1); 
    glBegin(GL_QUADS); 
    foreach(iter,dmesh->QFaces) 
    { 
      dface=dmesh->getFaceX(iter); 
      a=dface->getA();b=dface->getB();c=dface->getC();d=dface->getD(); 

      dvert=vlist->at(a); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(b); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(c); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(d); 
      glVertex3fv(dvert->getV()); 

    } 
    glEnd(); 
    glFlush(); 

    glColor4f(0.51,0.41,0.51,1); 
    glBegin(GL_TRIANGLES); 
    foreach(iter,dmesh->TFaces) 
    { 
     glBegin(GL_QUADS); 
      dface=dmesh->getFaceX(iter); 
      a=dface->getA();b=dface->getB();c=dface->getC();d=dface->getD(); 

      dvert=vlist->at(a); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(b); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(c); 
      glVertex3fv(dvert->getV()); 
    } 
    glEnd(); 
    glFlush(); 

    iter=0; 
    glLineWidth(3.0f); 
    glColor4f(0.31,0.27,0.51,1.0); 
    glBegin(GL_LINES); 
     count=dmesh->getEListLength(); 
     while(iter<count) 
     { 
      dedge=dmesh->getEdgeX(iter); 
      a=dedge->getA();b=dedge->getB(); 
      dvert=vlist->at(a); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(b); 
      glVertex3fv(dvert->getV()); 
      iter++; 
     } 
    glEnd(); 
    glFlush(); 

    iter=0; 
    glColor4f(1,1,1,1.0); 
    glPointSize(3.0f); 
    glBegin(GL_POINTS); 

     count=dmesh->getVListLength(); 
     while(iter<count) 
     { 
      dvert=dmesh->getVertX(iter); 
      glColor4fv(dvert->getColorV()); 
      glVertex3fv(dvert->getV()); 
      iter++; 
     } 
    glEnd(); 
    glFlush(); 

} 

ドロー法:(小立方体)

void DomainX::drawDomain() 
{ 
    qint32 count,iter; 
    MeshX *dmesh; 
    VertX *dvert; 
    EdgeX *dedge; 
    FaceX *dface; 

    QList<VertX* > *vlist; 


    dmesh=this->DMesh; 
    vlist=dmesh->getVList(); 

    iter=0; 
    int a,b; 
    int c,d; 
    glColor4f(0.1,0.1,0.1,0.01); 
    glBegin(GL_QUADS); 
    foreach(iter,dmesh->QFaces) 
    { 
      dface=dmesh->getFaceX(iter); 
      a=dface->getA();b=dface->getB();c=dface->getC();d=dface->getD(); 

      dvert=vlist->at(a); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(b); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(c); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(d); 
      glVertex3fv(dvert->getV()); 

    } 
    glEnd(); 
    glFlush(); 

    glColor4f(0.51,0.41,0.51,0.01); 
    glBegin(GL_TRIANGLES); 
    foreach(iter,dmesh->TFaces) 
    { 
     glBegin(GL_QUADS); 
      dface=dmesh->getFaceX(iter); 
      a=dface->getA();b=dface->getB();c=dface->getC();d=dface->getD(); 

      dvert=vlist->at(a); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(b); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(c); 
      glVertex3fv(dvert->getV()); 
    } 
    glEnd(); 
    glFlush(); 

    iter=0; 
    glLineWidth(3.0f); 
    glColor4f(0.71,0.27,0.51,1.0); 
    glBegin(GL_LINES); 
     count=dmesh->getEListLength(); 
     while(iter<count) 
     { 
      dedge=dmesh->getEdgeX(iter); 
      a=dedge->getA();b=dedge->getB(); 
      dvert=vlist->at(a); 
      glVertex3fv(dvert->getV()); 

      dvert=vlist->at(b); 
      glVertex3fv(dvert->getV()); 
      iter++; 
     } 
    glEnd(); 
    glFlush(); 

    iter=0; 
    glColor4f(1,1,1,1.0); 
    glPointSize(3.0f); 
    glBegin(GL_POINTS); 

     count=dmesh->getVListLength(); 
     while(iter<count) 
     { 
      dvert=dmesh->getVertX(iter); 
      glColor4f(0.3,0.7,0.6,1); 
      glVertex3fv(dvert->getV()); 
      iter++; 
     } 
    glEnd(); 
    glFlush(); 


} 
+1

奇妙に思えることの1つは、あなたが背面を淘汰していることです。あなたはあなたのキューブ上に半透明の辺を持ちたいと思っていますが、もしあなたがそれらの背面を淘汰すれば、あなたはキューブの反対側を見ることはありません! (または私は何かを誤解していますか?) – user1118321

+0

おっと、thatsもう一度間違います。しかし、まだ色と深さに問題があります。アウトプットはエスカーアートに見えます。私は近所のものと遠いものを区別できません。 –

+0

これは見た目です。 http://www.freeimagehosting.net/f9ipv –

答えて

2

1)図面の順序が原因です。

  • 顔の奥行きソートが必要です(遠くから近づく)。交差が発生した場合、交差によって定義された各サブフェイスに深度ソートを適用する必要があります。 具体的なケースでは、キューブのジオメトリを平面で2つに分割し、順番に面を描画するのは理論的には同じです。

    EDIT:キューブが唯一の透明なオブジェクトである場合、プレーンをレンダリングした後でキューブの深度ソートされた描画(ジオメトリを分割しない)も同様に機能します。

  • もう1つの解決策は、深度ピーリングのようなシェーダ技術を使用するフラグメントベースの深度ソートです。

2)前述したように、半透明オブジェクトの裏面は、面を外して描画する必要があります。

+1

ああそうです。私が忘れていたことは、あなたが透明性を扱っているので、深度テストでは十分ではないということです。起こりうることは、透明度を持つ立方体を最初に描画し、次にそれを横切る平面を描画することです。その時点で、深度は情報が不十分です。なぜなら、面を正面と背面の間に置く必要があるからです。キューブと平面を適切に混合するには、両面の色と透明度を把握する必要があります。デプステストでは、正面立方体の面が平面よりも近く、平面を描くのを邪魔しないということだけが述べられています。 – user1118321

関連する問題