Мне нужно создать полностью прозрачную поверхность, проходящую через начало координат осей и всегда параллельную экрану.
Я пытаюсь использовать этот код (в 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);
Если вы просто хотите заполнить буфер глубины, вы можете отключить запись цвета через 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, &вол, &ой, &унций);
Нет, ты не 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. Использование функции смешивания для удаления цвета вашей поверхности излишне сложно.