Полностью прозрачный объект в openGL
Мне нужно создать полностью прозрачную поверхность, проходящую через начало координат осей и всегда параллельную экрану. Я пытаюсь использовать этот код (в c++
) но в результате получается что-то вроде 50% смеси (не полностью):
glPushMatrix();
glLoadIdentity();
glBlendFunc(1, 1);
glBegin(GL_QUADS);
glVertex3f(-100, -100, -0.003814);
glVertex3f(100, -100, -0.003814);
glVertex3f(100, 100, -0.003814);
glVertex3f(-100, 100, -0.003814);
glEnd();
glPopMatrix();
Дополнительная информация: мне нужна эта прозрачная поверхность, чтобы получить точку на ней с помощью функции gluUnProject(winX, winY, winZ, model, proj, view, &ox, &oy, &oz);
3 ответа
Если вы просто хотите заполнить буфер глубины, вы можете отключить запись цвета через glColorMask()
:
glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
drawQuad();
glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
doUnproject();
Дополнительная информация: мне нужна эта прозрачная поверхность, чтобы получить точку на ней с помощью функции gluUnProject(winX, winY, winZ, model, proj, view, &ox, &oy, &oz);
Нет, ты не OpenGL не является графом сцены, и нет необходимости использовать значения с gluUnProject, полученные из OpenGL. Вы можете просто передать все, что вы хотите для winZ
, Используйте 0, если вы заинтересованы в ближней плоскости отсечения и 1 для дальней плоскости отсечения. Также вы можете прекрасно рассчитать только положение на экране для каждой точки. OpenGL не волшебство, его преобразования хорошо документированы и легко выполняются самостоятельно.
Используемая вами функция смешивания называется добавочным смешиванием:
Окончательный цвет = (исходный цвет * 1,0) + (целевой цвет * 1,0).
Это совсем не полностью прозрачно, если только кадровый буфер уже полностью белый в месте, где вы смешиваете (Цвет назначения == (1.0, 1.0, 1.0)). И даже тогда это поведение работает только в том случае, если вы используете цель рендеринга с фиксированной точкой, поскольку значения по умолчанию ограничены [0.0,1.0] после наложения.
Вместо этого рассмотрим
glBlendFunc (GL_ZERO, GL_ONE)
:Окончательный цвет = (исходный цвет * 0,0) + (целевой цвет * 1,0).
[...]
Окончательный цвет = исходный цвет
Тем не менее, вы, вероятно, получите лучшую производительность, если будете просто использовать цветовую маску для отключения цветной записи, как предложено в genpfault. Использование функции смешивания для удаления цвета вашей поверхности излишне сложно.