2

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()のnearパラメータを高く設定しすぎていたため、アルファ値を正しく設定していても、カメラは常にオブジェクトの前にあり、それを見る方法がありませんでした。

4

1 に答える 1

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;
}
于 2012-01-04T17:27:43.170 に答える