Альфа-смешивание OpenGL внутри прозрачного объекта - PullRequest
2 голосов
/ 04 января 2012

Я столкнулся с проблемой при симуляции прозрачности в 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 () высокая, поэтому, хотя я правильно устанавливал альфа-значение, камера все время находилась перед объектом, поэтому не было никакой возможности ее увидеть.

1 Ответ

0 голосов
/ 04 января 2012

Кажется, здесь работает:

#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;
}
...