Повторное использование выходных данных вершинного шейдера после переключения glDepthFunc

Я пытаюсь визуализировать одну и ту же сцену (состоящую из большого количества экземпляров мешей) после установки glDepthFunc на GL_LESS и GL_GREATER, чтобы получить первую и последнюю точки жизни всей сцены. Запуск шейдерной программы в обоих случаях идентичен, единственная разница между двумя запусками заключается в настройке glDepthFunc, т. е.:

while (true) {
    glDepthFunc(GL_LESS);
    runShader(buffer1);
    glDepthFunc(GL_GREATER);
    runShader(buffer2);
}

Шейдер состоит только из вершинного шейдера и фрагментного шейдера. Выходные данные фрагментного шейдера определенно будут различаться для двух исполнений шейдерной программы, но выходные данные вершинного шейдера должны быть одинаковыми для двух исполнений. Есть ли способ заставить OpenGL повторно использовать вывод первого вершинного шейдера при выполнении программы второго шейдера, чтобы во второй раз запускался только фрагментный шейдер?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Краткий ответ: Это невозможно.

Длинный ответ: невозможно напрямую повторно использовать результаты вершинного шейдера. Есть несколько подходов, которые могут гарантировать, что конкретный вершинный шейдер не должен запускаться дважды, но если вершинный шейдер не очень тяжелый, я не ожидаю, что какой-либо из этих методов будет быстрее, чем просто рендеринг сцены дважды.

Вариант 1. Преобразование обратной связи
Можно было бы использовать обратную связь преобразования и записать результаты вершинного шейдера в дополнительный VBO. Затем оба этапа рендеринга могут использовать буфер преобразования в качестве входных данных для рендеринга. Этот подход по-прежнему требует сквозного вершинного шейдера в путях рендеринга и, скорее всего, приведет к ухудшению производительности, если только первый вершинный шейдер не будет настолько медленным, что компенсирует дополнительные накладные расходы на обратную связь преобразования + один дополнительный вызов рендеринга.

Вариант 2: Атомарные операции
Вместо обычного рендеринга с проверкой глубины можно использовать atomicMin и atomicMax во фрагментном шейдере для вычисления минимальной/максимальной глубины для каждого фрагмента. Для этого подхода требуются две текстуры изображения uint (одна для минимальной, одна для максимальной), и вам придется самостоятельно преобразовывать значения глубины с плавающей запятой в представление с фиксированной точкой (uint). Опять же, вполне вероятно, что дополнительные накладные расходы из-за потери раннего тестирования глубины и использования атомарных операций во фрагментном шейдере будут медленнее, чем просто рендеринг всей сцены дважды.

Похоже, мне нужно просто запустить весь шейдер дважды. Вершинный шейдер довольно прост и просто применяет преобразование к точке, поэтому его двойной запуск не должен быть большой потерей и почти наверняка будет дешевле, чем явное сохранение где-то вывода. Спасибо!

Vasu 24.04.2022 16:12

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