Создание матриц вида в шейдере GLSL - PullRequest
2 голосов
/ 18 октября 2011

У меня есть много позиций и направлений, хранящихся в 1D текстурах на GPU.Я хочу использовать их как источники визуализации в геометрическом шейдере GLSL.Чтобы сделать это, мне нужно создать соответствующие матрицы представлений из этих текстур.

Моя первая мысль состоит в том, чтобы перейти в ЦП, прочитать текстуры в память и создать оттуда связку матриц представления, с чем-токак glm::lookat().Затем отправьте матрицы в качестве шейдеров в качестве равномерных переменных.

Мой вопрос: можно ли пропустить этот обходной путь и вместо этого создать матрицы представления непосредственно в геометрическом шейдере GLSL?Кроме того, разумно ли это возможно?

Ответы [ 3 ]

1 голос
/ 18 октября 2011

Никто не говорит (или никто не должен говорить), что ваша матрица представления должна исходить от процессора через униформу. Вы можете просто сгенерировать матрицу вида из векторов вашей текстуры прямо внутри шейдера. Может быть, вам поможет реализация старого доброго gluLookAt .

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

Но, возможно, вы можете предварительно сгенерировать матрицы в другую текстуру / буфер с помощью простого GPGPU-подобного шейдера, который не делает ничего, кроме генерации матрицы для каждой позиции / вектора в текстурах и сохранения ее в другой текстуре (используя FBO) или буфер (используя обратную связь преобразования). Таким образом, вам не нужно делать обход в ЦП и вам не нужно генерировать матрицы заново для каждой вершины / примитива / чего бы то ни было. С другой стороны, это увеличит необходимую память, так как матрица 4x4 немного тяжелее, чем позиция и направление.

1 голос
/ 18 октября 2011

Конечно. Прочитайте текстуру и постройте матрицы из значений ...

vec4 x = texture(YourSampler, WhateverCoords1);
vec4 y = texture(YourSampler, WhateverCoords2);
vec4 z = texture(YourSampler, WhateverCoords3);
vec4 w = texture(YourSampler, WhateverCoords4);
mat4 matrix = mat4(x,y,z,w);

Есть проблемы с этим? Или я что-то пропустил?

0 голосов
/ 18 октября 2011

Матрица представления является унифицированной, и униформы не изменяются в середине пакета рендеринга, и при этом они не могут быть записаны из шейдера (напрямую). Поскольку я не понимаю, насколько это возможно, по крайней мере, не напрямую.

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

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

...