2011-01-12 7 views
1

前面と背面の両方が見える(透明でない)透明なサーフェスを表示しようとしています。バックグラウンドでのOpenGLアルファブレンディングの問題が表示されます

たとえば、両面に透明度が適用されている円錐または円柱を表示します。 表面の一部がアルファ値を正しく処理していないように思われる、目に見えるアーティファクトがあります。

I(opengl)がアルファをサーフェスの表側からサーフェスの裏側に適用しようとしているような問題があります。 (表面の内側/外側の両方が見えるとき)。

void init() 
{ 
    glMatrixMode(GL_PROJECTION); 
    gluPerspective(/* field of view in degree */ 40.0, 
     /* aspect ratio */ 1.0, 
     /* Z near */ 1.0, /* Z far */ 10.0); 
    glMatrixMode(GL_MODELVIEW); 
    gluLookAt(0.0, 0.0, 5.0, /* eye is at (0,0,5) */ 
     0.0, 0.0, 0.0,  /* center is at (0,0,0) */ 
     0.0, 1.0, 0.);  /* up is in positive Y direction */ 
    glTranslatef(0.0, 0.6, -1.0); 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); 
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse); 
    glLightfv(GL_LIGHT1, GL_POSITION, light1_position); 
    glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse); 
    glLightfv(GL_LIGHT2, GL_POSITION, light2_position); 

    glClearDepth(1.0f); 
    glEnable(GL_DEPTH_TEST); 
    //glEnable(GL_CULL_FACE); 
    glFrontFace(GL_CW); 

    glShadeModel(GL_SMOOTH); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

} 
void draw() 
{ 
    static GLfloat amb[] = {0.4f, 0.4f, 0.4f, 0.0f}; 
    static GLfloat dif[] = {1.0f, 1.0f, 1.0f, 0.0f}; 
    static GLfloat back_amb[] = {0.4f, 0.4f, 0.4f, 1.0f}; 
    static GLfloat back_dif[] = {1.0f, 1.0f, 1.0f, 1.0f}; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_LIGHT1); 
    glDisable(GL_LIGHT2); 
    amb[3] = dif[3] = 0.5f;// cos(s)/2.0f + 0.5f; 
    glMaterialfv(GL_FRONT, GL_AMBIENT, amb); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif); 
    glMaterialfv(GL_BACK, GL_AMBIENT, back_amb); 
    glMaterialfv(GL_BACK, GL_DIFFUSE, back_dif); 
    glPushMatrix(); 
    glTranslatef(-0.3f, -0.3f, 0.0f); 
    glRotatef(angle1, 1.0f, 5.0f, 0.0f); 
    glutSolidCone(1.0, 1.0, 50, 2); 
    glPopMatrix(); 

    ///... 
    SwapBuffers(wglGetCurrentDC()); // glutSwapBuffers(); 

} 

コードに基づいている:問題示すFlickrの2枚の画像にhttp://www.sgi.com/products/software/opengl/examples/glut/examples/source/blender.c

tinyurledリンク(しかしアウト製品コードではなく、上記のコードでは、両方の問題の同じ種類を有します)。 http://flic.kr/p/99soxyおよびhttp://flic.kr/p/99pg18

ありがとうございます。

答えて

5

問題にはおそらく2つの問題があります。

  • あなたの深度テストを有効にし、すべてのポリゴンがデプスバッファへの書き込みされて、彼らは最も近い多角形の後に描かれている場合は、さらに離れているポリゴンがピクセルの色に寄与することができません。深度テストを無効にしてください。

  • アルファブレンディングは、非可換的な操作であるため、三角形が描画される順番が重要であり、結果が変更されます。一貫した結果を得るには、三角形を一貫した順序で描画する必要があります。コードでは、この順序は、たとえばビューポイントによって異なります。オブジェクトが凸面であるため、カリングを有効にし、バックフェースの三角形(カメラに最も遠い)を描画し、次に正面三角形(最も近いもの)

  • の2つのパスでオブジェクトを描画できます

より一般的には、任意のジオメトリの正しいブレンドは難しい問題です。詳細については、Order Independent Transparencyアルゴリズム(深度ピーリングなど)を参照してください。

+0

ありがとうございます。私たちのソフトウェアでそれを行うには長いプロセスのようです。 – Max

+0

@マックス、あなたは大歓迎です。「本当の」透明性を実現するには、いくらかの作業が必要です。あなたのニーズや使用状況に応じて、見栄えの良い透明性を達成するのが簡単になります。あなたのモデル/環境/レンダリングスタイルなどの特殊性を使用することを躊躇しないでください。 – rotoglup

関連する問題