Альфа-смешивание 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() слишком высоким, поэтому, хотя я правильно устанавливал альфа-значение, камера все время находилась перед объектом, поэтому не было возможности его увидеть.
1 ответ
Кажется, работает здесь:
#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;
}