Возможные проблемы с синхронизацией памяти при итерации вычислительных шейдеров.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Возможные проблемы с синхронизацией памяти при итерации вычислительных шейдеров.

Сообщение Anonymous »

Код, прикрепленный к этому сообщению, представляет собой абстрактную форму метода, который я хочу использовать для запуска тестов пересечения для трассировщика лучей. Из-за ограничений памяти мне нужно тестировать только небольшие группы лучей за раз, поэтому я пытаюсь итеративно распределять подмассивы данных по SSBO для прохождения через шейдеры, а затем в конце компилировать их в полные массивы вершин. Я подтвердил, что все размеры данных совпадают и ошибок не возникает, но у меня возникают проблемы с каждым циклом, кроме первого, что приводит к появлению только 0 в векторе «intCheck», который я использую в качестве заполнителя для соответствующих выходных данных. Я подозреваю, что проблема связана с синхронизацией памяти в последующих циклах, но простые исправления, такие как использование glMemoryBarrier() или ограждение, не сработали, и я не понимаю, что делать дальше. Если кто-нибудь увидит решение этой проблемы, это будет огромной помощью :slight_smile:

void model::rayTrace(const char* triCheckFile, const char* closestFile, vector* origins, vector* directions, int numBounces, glm::vec3 rgb) {

numRays = origins->size();

vecCheck.resize(numRays * totalInd / 3.0); // note totalInd / 3 = numTriangles
intCheck.resize(numRays * totalInd / 3.0);

for (int i = 0; i < numRays * totalInd / 3.0; i++) {
vecCheck = glm::vec4(i % 12);
intCheck = 0.0;
}

int raysPerCall = min(numRays, int(availableChecks / (totalInd / 3.0)));
int numCalls = numRays / int(raysPerCall) + 1;

triCheckShader.setUp(triCheckFile);
triCheckShader.Activate();

glGenBuffers(1, &vecCheckB);
glGenBuffers(1, &intCheckB);

int raysDone = 0; // numRays in this call
int isLast; // check if final call
for (int i = 0; i < numCalls; i++) {
int rayPack = 0;
int diff = 0;
if (i != numCalls - 1) {
rayPack = raysPerCall;
isLast = 0;
cout

Подробнее здесь: https://stackoverflow.com/questions/791 ... te-shaders
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»