полностью прозрачный объект в 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);


person mauro    schedule 14.12.2013    source источник
comment
Не могли бы вы уточнить, что вы имеете в виду: мне нужна эта прозрачная поверхность, чтобы получить на ней точку с помощью функции gluUnProject(winX, winY, winZ, model, proj, view, &ox, &oy, &oz);. Я интерпретировал это так, что мне нужна эта поверхность, чтобы покрыть точку, но другие люди интерпретировали это по-другому.   -  person Andon M. Coleman    schedule 15.12.2013
comment
Я использую эту поверхность, чтобы взять точку (x, y, z) на ней. С помощью gluUnProject я получаю координату объекта, на который наведен курсор, и, используя эту поверхность, я могу получить на ней точку.   -  person mauro    schedule 15.12.2013


Ответы (3)



Дополнительная информация: мне нужна эта прозрачная поверхность, чтобы получить на ней точку с помощью функции gluUnProject(winX, winY, winZ, model, proj, view, &ox, &oy, &oz);

Нет, не знаешь. OpenGL не является графом сцены, и нет никаких обязательств использовать значения с gluUnProject, полученные из OpenGL. Вы можете просто передать все, что хотите, для winZ. Используйте 0, если вас интересует ближняя плоскость отсечения, и 1 для дальней плоскости отсечения. Также вы можете отлично просто рассчитать положение на экране для каждой точки. OpenGL — это не волшебство, преобразования, которые он выполняет, хорошо документированы и их легко выполнить самостоятельно.

person datenwolf    schedule 14.12.2013
comment
Если я использую значения 0 или 1 для winZ, у меня будет прекрасное решение, только если я не переверну сцену... или, по крайней мере, мне так показалось - person mauro; 15.12.2013
comment
@ user3102760: это не так. Однако вы должны использовать правильные матрицы. - person derhass; 15.12.2013
comment
@ user3102760: Нет, потому что все вращение и т. Д. Покрываются матрицей представления модели, которую вы передаете gluUnProject, по сути, glUnProject делает в точности обратный процесс, который делает OpenGL при преобразовании вершины на экран. - person datenwolf; 16.12.2013

Используемая вами функция смешивания известна как аддитивное смешивание:

Конечный цвет = (ИсходныйЦвет * 1,0) + (КонечныйЦвет * 1,0).

Это что угодно, но полностью прозрачное, за исключением случаев, когда буфер кадра уже полностью белый в том месте, где вы смешиваете (DestinationColor == (1.0, 1.0 , 1.0)). И даже тогда это поведение работает, только если вы используете цель рендеринга с фиксированной точкой, потому что значения по умолчанию фиксируются на [0.0,1.0] после смешивания.


Вместо этого рассмотрим glBlendFunc (GL_ZERO, GL_ONE):

Конечный цвет = (ИсходныйЦвет * 0,0) + (КонечныйЦвет * 1,0).

[...]

Конечный цвет = исходный цвет


Тем не менее, вы, вероятно, получите лучшую производительность, если просто используете цветовую маску для отключения записи цвета, как предлагает genpfault. Использование функции смешивания для удаления цвета поверхности излишне сложно.

person Andon M. Coleman    schedule 14.12.2013