2012-02-19 2 views
1

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

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

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

+0

Какие инструменты Вы используете, чтобы это сделать? Попытайтесь пометить свой вопрос названием этого инструмента и, возможно, некоторыми другими, тесно связанными и соответствующими тегами. – Irfy

ответ

1

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

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


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

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

Если вы абсолютно должны визуализации в 2D текстуры, вы можете использовать более медленный метод: read from the texture into a buffer object. ОПО в первую очередь для асинхронной передачи пикселей, так что я хотел бы предложить давая GPU-то еще делать между временем выполнить glGetTexImage в буфер и время, которое вы вызываете glDrawArrays для визуализации. В противном случае вы просто остановите GPU.

+1

Я храню данные как текстуры, потому что местоположения частиц - это выход фрагментарного шейдера. – JohnD

+0

@JohnD: Тогда вы должны были упомянуть об этом. Я могу дать только советы, основанные на том, что вы говорите, а не то, о чем вы думаете. См. Мое редактирование. –

+0

Вполне возможно хранить вершины в текстурах. Вот пример http://jsfiddle.net/greggman/7t2Dj/ – gman

3

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

int maxVertexTextureImageUnits; 
glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVertexTextureImageUnits); 

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

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

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

1

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

Смежные вопросы