Можно ли читать данные из вершинного шейдера?
Я пытаюсь написать простой тест GPGPU. Чтобы загрузить данные в массив вершинного буфера, выполните некоторые вычисления в вершинном шейдере и прочитайте данные обратно. Является ли это возможным? Я планирую запустить это на графических процессорах SGX.
Есть ли способ сделать это? Я не хочу, чтобы он проходил через трансформацию, обрезку, фазы листов и обработку пикселей. это влечет за собой дополнительные накладные расходы и изменяет мои данные.
я могу прочитать данные и проверить их в процессоре? есть ли вообще в opengl es?
Я могу также выполнять вычисления в пиксельных шейдерах, отправляя данные через текстуру и умножая их на некоторые константы и записывая их в другой буфер кадра. но как мне вернуть его обратно? я действительно не хочу представлять это на экране. в любом случае, чтобы сделать это? Может ли кто-нибудь указать мне на некоторые учебники, если таковые имеются?
4 ответа
Чтение вывода вершин: ищите обратную связь Transform - но для этого вам понадобится OpenGL ES 3.0.
Для ES2.0 я предлагаю использовать фрагментный шейдер и методы Render To Texture. Вот некоторая ссылка с учебником. После рендеринга в текстуру вы должны прочитать пиксели текстуры.
Хороший учебник по чтению данных здесь
учебник об обратной связи: http://open.gl/feedback
Вы не можете читать данные из вершинного шейдера непосредственно в OpenGL ES 2.0. Таким образом, вы можете поместить свои данные в пиксельный / фрагментный шейдер, прикрепить его к объекту кадрового буфера (FBO) и затем использовать glReadPixels, чтобы получить данные в качестве текстуры в вашем ЦП. Эта ссылка описывает концепцию и код сннипета: здесь. Надеюсь, это поможет.
"...computation in the vertex shader, and read the data back. Is it possible? I am planning to run this on SGX GPUs."
Поскольку SGX поддерживает Opengles 2.0, а не 3.0, PowerVR SGX не поддерживает чтение вывода вершинного шейдера (спецификация OpenGL ES 2.0 не включает такую функциональность).
"can I read back the data and examine it in the CPU? is there anyway in opengl es?
"Вы можете использовать объекты кадрового буфера и читать то же самое, используя glRead API. Вы можете прочитать об объектах FrameBuffer здесь
Ссылка: http://en.wikipedia.org/wiki/Framebuffer_Object Ссылка: чтение значений пикселей из объекта буфера кадра (FBO) с использованием объекта Pixel Buffer (PBO)
Если вы рассчитываете GPGPU, то я рекомендую вам перейти на OpenCL. SGX поддерживает OpenCL EP 1.1.
Хотя запись из вершинного шейдера в внеэкранный режим невозможна в OpenGL ES2, вы можете сделать это из пиксельного шейдера.
Сначала вам нужно выполнить рендеринг в внеэкранный буфер, затем вы можете либо отобразить его как текстуру для другого объекта на экране, либо вы можете прочитать его обратно, используя readPixels обычным способом. Простой список шагов приведен в https://gist.github.com/prabindh/9201855.