OpenGL GL_DEPTH_TEST против glDepthFunc и glDepthMask?

Я использую glDisable(GL_DEPTH_TEST) отключить тестирование глубины, думая, что отключает только "тестирование глубины". Думаю, причина, по которой я запутался, заключается в том, что я создал две функции: одну для отключения "проверки" глубины, а другую для отключения "записи" глубины с помощью glDepthMask(GL_FALSE);

Если отключить GL_DEPTH_TEST отключает как "тестирование", так и "запись", тогда это будет эквивалентно выполнению:

glDepthFunc(GL_ALWAYS​); // DISABLE TESTS (OR ACTUALLY ALWAYS LET THE TEST SUCCEED)
glDepthMask(GL_FALSE); // DISABLE WRITES

Я думаю, что нет смысла отключать GL_DEPTH_TEST если я не хочу отключить оба теста и записи, и мне интересно, какой из них лучше. Формулировка кажется запутанной, но, возможно, это только я. Я предполагаю делать отключение тестов глубины с glDepthFun(GL_ALWAYS) все равно будет делать сравнение, я полагаю, что нет способа полностью отключить тест глубины, в то же время разрешая запись?

1 ответ

Решение
glDisable(GL_DEPTH_TEST)

отключает тест глубины от трубопровода. Если вы используете:

glDepthFunc(GL_ALWAYS​);
glDepthMask(GL_FALSE);

вместо этого он просто скрывает его после условия (но все еще присутствует в конвейере), что может означать разницу в производительности на некоторых платформах...

Также при использовании вашего эквивалента вам потребуется установить / запомнить оригинал DepthFunc в случае, если вы хотите включить его снова (так как есть много методов рендеринга, которые должны переключить DeptTest вкл / выкл несколько раз.

И, наконец, два вызова функций GL больше, чем один. Так что с точки зрения производительности с помощью glDisable(GL_DEPTH_TEST) лучше для этого. glDepthFunc,glDepthMask предназначены для различных целей, таких как многопроходный рендеринг, независимая от порядка прозрачность, дырки и т. д.

Другие вопросы по тегам