2012-01-04 19 views
2

OpenGLでシミュレーションの透明性が問題になっています。 ここにシナリオがあります:透明なオブジェクト内のOpenGLアルファブレンディング

私は球で表される船を持っています。 今、私は船の周りにシールドを追加することについて。私は球も選びましたが、半径が大きく、アルファ係数0.5(不透明度)を設定しました。ただし、シールドが表示されず、色が混ざり合っていません(あたかもそこになかったかのように)。

カメラは第1球の中心にあります。問題は私が球の中にいることだと思うので、openglは無視します(描画しないでください)。

コードは次のようになります。

//ship colors setup with alpha 1.0f 
glutSolidSphere(1, 100, 100); original sphere (ship) 
//shield colors setup with alpha 0.5f 
glutSolidSphere(3, 100, 100); //the shield whose colors should blend with the rest of the scene 

は、私は、船の前で直方体でシールドをシミュレートするためにかかわらず持っています。 しかし、これは私が欲しいものではありません...

編集:私は間違いを発見しました。私はgluPerspective()の近くのパラメータも高く設定していました。したがって、アルファ値を正しく設定していても、カメラは常にオブジェクトの前にあって、見る方法がありませんでした。

答えて

0

ここで働いているようだ:

#include <GL/glut.h> 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0, 0, -5); 

    glDisable(GL_BLEND); 
    glColor4ub(255,0,0,255); 
    glutSolidCube(1.0); 

    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glColor4ub(0,255,0,64); 
    glutSolidSphere(1.5, 100, 100); 

    glFlush(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    glViewport(0, 0, w, h); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60, (double)w/(double)h, 0.01, 100); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("Blending"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    return EXIT_SUCCESS; 
} 
+0

もカメラは球体の外に、それは船の中心部に右ですされていない...しかし、私が中心にカメラを移動する場合、あまりにも動作するようですあなたの例ではキューブです。オブジェクトの内部で何が起こるか説明できますか? –

+0

まあ、 'glEnable(GL_DEPTH_TEST)'と仮定し、内部(=最初に描画された)球の内部にいる場合は、深度バッファが特定の(近くの)Z値になります。 2番目の球をさらに引き出しようとすると、2番目の球のすべてのピクセルで深度テストが失敗します。なぜなら、それらはすべて内側の球よりも遠く離れているからです。私の例は、 'GL_DEPTH_TEST'を有効にしていないので、デフォルトではoffになっているので動作します。 – genpfault

関連する問題