2016-11-15 3 views
0

Это может показаться основным вопросом, но как вы можете работать с объектами, созданными с помощью шейдеров в OpenGL, или манипулировать ими?Работа с объектом OpenGL из шейдера

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

У меня есть координаты моя начальная вершина, что я определил в своей основной программе, но как только они достигают геометрии шейдер, положение вычисляется с помощью:

gl_Position = projection_matrix * view_matrix * vec4(square_point,1); 
EmitVertex(); 

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

Я думал о том, чтобы делать некоторые данные о GPU-> CPU, используя буферы, но есть так много объектов и так много координат, что они неумолимы.

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

+0

Вы работаете с координатой 'w' после преобразования? Это шаг (разделение на него всех 4 составляющих вектора), который происходит после запуска Geometry Shader. Если вы захватываете испущенные вершины и сравниваете их, они еще не выполнили этот шаг. –

+0

@ AndonM.Coleman - Я так не думаю. Я применяю точную формулу, которую я поставил в вопросе. –

ответ

0

Вы можете использовать так называемые объекты буфера хранения шейдеров SSBO. Вы создаете их в своем шейдере с помощью классификатора buffer. Затем вы выполните необходимые вычисления и загрузите свои данные через glMapBufferRange и memcpy.

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