Лучшие способы загрузки вершин треугольника в вашем шейдере для ray tracer - PullRequest
0 голосов
/ 11 февраля 2019

В настоящее время я пытаюсь реализовать трассировщик лучей с треугольной сеткой в ​​WebGL 2. Пока я загружаю данные в буферную текстуру, а затем распаковываю их следующим образом:

for (int i = 0; i < vertsCount; i += 3) {

            a = texelFetch(uMeshData, ivec2(i, 0), 0);
            b = texelFetchOffset(uMeshData, ivec2(i, 0), 0, ivec2(1, 0));
            c = texelFetchOffset(uMeshData, ivec2(i, 0), 0, ivec2(2, 0));


            bool isHit = hitTriangleSecond(R_.orig, R_.dir, a.xyz, b.xyz, c.xyz, uvt, triangleNormal, intersect, z);;
            if (isHit) {

                if (z<mindist && z > 0.001) {
                    //weHitsomething    
                }
            }      
        } 

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

Я слышал о технике ограничивающего прямоугольника и некоторых данных для хранения дерева.Но я не знаю, как это сделать.

Было бы неплохо, если бы кто-то предоставил некоторую информацию об этом.И помимо этого.

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

Так что мой вопрос в том, как проверить «ближайшие» треугольники в направлении луча.

1 Ответ

0 голосов
/ 21 февраля 2019

Реализация raytracer в WebGL - довольно сложная задача.Я бы посоветовал начать с простого.Например, используя трехмерную текстуру и сохраняя до 4 треугольных индексов в каждой ячейке / пикселе.(Вам придется прокладывать лучи по текстуре, пока не дойдете до треугольника.) Получив индекс треугольника, вы можете искать вершины во второй текстуре (в вашем коде это называется uMeshData).

Вы можете построитьданные 3D-текстуры в Javascript, на этапе инициализации.(Позже вы, вероятно, могли бы реализовать это на графическом процессоре, отрисовав треугольники на 2D-срезах 3D-текстуры, используя буфер глубины для выбора ближайшего треугольника к каждому пикселю.)

Это не даст правильного результатаесли имеется более 4 треугольников, перекрывающих ячейку / пиксель 3D-текстуры.Он также не очень эффективен (из-за избыточности лучевого маршинга с фиксированным шагом), но, по крайней мере, перемещает вас в правильном направлении.После этого вы можете попробовать более продвинутые решения (которые, вероятно, будут включать дерево, например, иерархию ограничивающих томов).

...