Смешение OpenGL со скайбоксом

Я пытаюсь отобразить полупрозрачный объект внутри скайбокса. Однако в моей текущей реализации текстуры смешиваются с цветом фона вместо скайбокса (если на пути нет другого объекта).

Вот некоторые вехи в моей реализации, которыми, как мне кажется, было бы полезно поделиться:

в этом:

[...]
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
[...]

оказывать:

[...]
[render scene]
[...]
glUseProgram(program_skybox);
glDepthFunc(GL_LEQUAL);
glDepthMask(GL_FALSE);
[bind view & projection matrices]
[draw skybox]
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);

Что мне нужно изменить, чтобы мой скайбокс смешался? Я полагаю, проблема в буфере глубины?


person Ecto    schedule 25.04.2020    source источник
comment
Как всегда, альфа-смешивание требует сортировки. Поскольку ваш скайбокс по определению является самым дальним объектом, вы должны нарисовать его первым.   -  person Quentin    schedule 25.04.2020
comment
@Квентин, о да, спасибо, добавь это как ответ   -  person Ecto    schedule 25.04.2020
comment
Возможно, дубликат stackoverflow.com/questions/45770076/? Это не та же самая проблема, но та же основная причина   -  person BDL    schedule 25.04.2020
comment
также взгляните на это: Как создать прозрачность, независимую от заказа?   -  person Spektre    schedule 26.04.2020
comment
@Spektre Я просто смотрел на независимую от порядка прозрачность, но я не очень понял это. Кроме того, я предполагаю, что предложенный вами комментарий будет работать только для двухслойных объектов, но в моей сцене много прозрачных объектов. Я хотел бы услышать от вас, если вы знаете больше об этой теме!   -  person Ecto    schedule 26.04.2020
comment
@Ecto вы можете иметь более прозрачные объекты ... этот связанный ответ просто избегает z-сортировки (в соответствии с примитивным способом) за счет вместо этого рендеринга по правилу намотки CW / CCW. Вы знаете, если у вас определена сетка со строгой намоткой (поэтому GL_CULL_FACE работает как надо), то все задние грани имеют противоположную намотку всем передним граням. Так что не надо их сортировать просто рендерить по намотке. из-за этого вы просто z-сортируете объекты вместо всех граней ... Я избегаю даже этого, поскольку мои прозрачные объекты не пересекаются и концентричны ... так что один находится внутри другого.   -  person Spektre    schedule 26.04.2020
comment
@Ecto В случае одного слоя вы просто используете половину проходов рендеринга ... Я также рекомендую посмотреть другой ответ от Zouch, ссылка nVidia подробно рассматривает эту проблему.   -  person Spektre    schedule 26.04.2020
comment
@Spektre Спасибо, пока что я только что сделал так, чтобы все полупрозрачные пиксели имели альфа-значение 1 или 0, поэтому нет необходимости объединять цвета и отброшенные фрагменты с нулем, что не выглядит идеально, но выполняет свою работу и, вероятно, реализовать гораздо проще.   -  person Ecto    schedule 26.04.2020