2015-06-02 4 views
1

Мой компьютер не поддерживает OpenCL в вычислительных шейдерах графического процессора или OpenGL, поэтому мне было интересно, будет ли это прямой процесс получения данных из вершинного или фрагментарного шейдера?Получить данные из шейдера OpenGL?

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

Возможно ли это? Если да, то как мне это сделать? У меня есть базовое знание OpenGL, я создал программу, которая рисует многоугольники с цветами. Мне действительно нужен способ вернуть значения позиции из шейдера.

ответ

2

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

  • Создание и связать Framebuffer Object
  • Создание объекта Renderbuffer и прикрепить ее к FrameBuffer Object
  • визуализации вашей сцены. Результат будет в связанном объекте Framebuffer, а не на экране.
  • Используйте glReadPixels для извлечения данных из объекта Framebuffer.

Помните, что glReadPixels, как и большинство методов получения данных из памяти GPU в основную память, является медленным и, вероятно, непригодным для приложений реального времени. Но это лучшее, что вы можете сделать, если у вас нет функций, предназначенных для этого, например Compute Shaders, или готовы сделать это асинхронно с Pixel Buffer Objects.

Вы можете узнать больше о Framebuffers here.

+0

есть также https://www.opengl.org/wiki/Transform_Feedback –

+0

@ j-p Существует, но это происходит до Фрагмент-шейдера, поэтому в этом случае это не очень полезно. – orost

+0

, я видел только 'position' и' фрагмент' OR 'vertex' ... отметим, что в решении с 2-мя проходами со вторым, занимающим вертикальное перемещение вершин на предварительно вычисленной текстуре в 1-м проходе, можно использовать обратную связь. Это имело бы смысл, только если op для рендеринга приведет к 3d ... –

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