Напишите SSBO в VS и прочитайте из FS

Использование библиотеки Vulkan У меня есть позиции vec3[], рассчитанные в вершинном шейдере (сотни позиций всенаправленного света, преобразованные матрицей TBN), которые я хочу передать фрагментному шейдеру для чтения.

Я пытаюсь создать для этого буфер SSBO с флагом VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, поскольку никакие данные в него не будут загружены со стороны клиентского ЦП (пишет только VS, затем из него читает FS). Пока буфер работает, у меня есть опасность чтения/записи.

Буфер в шейдере:

//ssbo for TS omni
layout(set=0, binding=11) coherent buffer OmniPositionsTS
{
    vec3 mOmniPositionsTS[];
};

Вместо SSBO попробовал простой массив [16] «out», используемый как переменная «in» в FS, и он работает как шарм, но, конечно, я очень ограничен до 32 таких атрибутов входа/выхода, поэтому возвращаясь к решению SSBO:

Означает ли все это, что фрагментный шейдер не ждет, пока вершинный шейдер завершит запись SSBO? Почему другие шейдеры, изменяющие переменные «out» и «in», не страдают от этого состояния гонки?

Должен ли я вызывать MemoryBarrier в вершинном шейдере? Каков вообще предпочтительный способ передачи положений света, преобразованных TBN, во фрагментные шейдеры?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Без дополнительной синхронизации все остальные данные, записанные вызовами VS вокруг треугольника, не могут быть доступны FS. И нет, барьер памяти в шейдере не в счет. Вам нужна жесткая зависимость выполнения между вызовами VS, генерирующими данные, и вызовами FS, получающими их. Обычно это какой-то конвейерный барьер, содержащий барьер памяти. И для этого требуется, чтобы вызовы VS, генерирующие данные, находились в другом вызове функции рисования, чем вызовы FS, читающие их.

Спасибо. Кажется, когерентный буфер + MemoryBarrier - это путь, если он не влияет на производительность. Если да, то преобразование TBN в FS — это то, что вам нужно. Нужно сделать профиль.

Avi 03.04.2024 16:21

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