Интерпретировать данные текстуры как данные вершин в вершинном шейдере - PullRequest
1 голос
/ 20 февраля 2012

Я пытаюсь использовать шейдер Vertex для перемещения частиц (хранящихся в текстуре), которые передаются в шейдер Frag и сохраняются в отдельной текстуре.

Я пытаюсь добиться эффективного пространственного биннинга на GPU. Это для симулятора жидкости SPH.

Возможно ли передать все пиксели (тексели) 2D-текстуры в Vertex Shader? Каждый текст (RGBA) будет интерпретироваться как входящая вершина (XYZW).

Ответы [ 3 ]

3 голосов
/ 09 апреля 2012

Возможно передавать 2D текстуры в вершинный шейдер, если аппаратное обеспечение поддерживает Vertex Texture Fetch .Вы можете проверить это, используя следующий код:

int maxVertexTextureImageUnits;
glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVertexTextureImageUnits);

Если maxVertexTextureImageUnits равен нулю, то эта функция не поддерживается.

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

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

2 голосов
/ 20 февраля 2012

Невозможно сделать вид, что 2D-текстура на самом деле является данными вершины.Однако мне интересно, почему вы пытаетесь сделать это таким образом.

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


Учитывая, что «я сохраняю данные в качестве текстур, потому что расположение частиц является выходом фрагментного шейдера», я могу посоветовать еще кое-чтополезно: буфер текстур .Это одномерные текстуры, которые хранят свои данные в буферном объекте.Они по-прежнему могут использоваться в качестве цели рендеринга (хотя, очевидно, вам необходимо изменить способ растрирования данных, поскольку они являются одномерными целями рендеринга), но то, что они рендерит, хранится в буферном объекте.

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

Если вы абсолютно должны визуализировать в 2D текстуру, вы можетеиспользуйте более медленный метод: чтение из текстуры в буферный объект. PBOs в основном предназначены для асинхронной передачи пикселей, поэтому я бы посоветовал дать GPU что-то еще, что нужно сделать между временем выполнения glGetTexImage вбуфер и время, которое вы вызываете glDrawArrays для рендеринга из него.В противном случае вы просто остановите графический процессор.

1 голос
/ 09 апреля 2012

Да, это просто: просто визуализируйте столько вершин, сколько у вас есть пикселей, но не связывайте буфер вершин.Вместо этого вычислите пиксель, соответствующий текущей вершине, получив идентификатор вершины (gl_VertexID) (вы должны отобразить как точки.) Из идентификатора вершины вы можете выполнить выборку текстуры и получить данные (убедитесь, что вы используетеtexelFetch.)

...