是否可以从顶点着色器读取数据?

时间:2013-10-01 18:23:35

标签: opengl-es opengl-es-2.0 shader gpgpu powervr-sgx

我正在尝试编写一个简单的GPGPU基准测试。要将数据加载到顶点缓冲区数组中,请在顶点着色器中进行一些计算,然后再读取数据。可能吗?我打算在SGX GPU上运行它 有没有办法做到这一点?我不希望它经历转换,剪切,平铺阶段和像素处理。这会产生额外的开销,并改变我的数据。

我可以读回数据并在CPU中检查它吗?无论如何在opengl es?

我可以在像素着色器中进行计算,也可以通过纹理发送数据并乘以一些常量并将其写入另一个帧缓冲区。但我该如何取回它?我真的不想把它呈现给屏幕。      无论如何要做到这一点?如果可以的话,有人会指点我一些教程吗?

4 个答案:

答案 0 :(得分:4)

读取顶点输出:查找Transform Feedback - 但您必须使用OpenGL ES 3.0才能使用它。

对于ES2.0,我建议使用片段着色器和渲染到纹理技术。 Here is some link with tutorial 渲染到纹理后,你基本上必须读取纹理的像素。

Nice tutorial on reading the data here

有关反馈的教程:http://open.gl/feedback

答案 1 :(得分:2)

您无法直接在OpenGL ES 2.0中读取顶点着色器中的数据。 因此,您可以将数据发送到像素/片段着色器,将其附加到帧缓冲对象(FBO),然后使用glReadPixels将数据作为纹理在CPU中获取。 此链接描述了snnipet的概念和代码: here。 希望这可能有所帮助。

答案 2 :(得分:1)

"...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?” 您可以使用framebuffer对象并使用glRead API读取它们。你可以在这里阅读有关FrameBuffer对象的内容

参考:http://en.wikipedia.org/wiki/Framebuffer_Object 参考:Reading the pixels values from the Frame Buffer Object (FBO) using Pixel Buffer Object (PBO)

如果您正在进行GPGPU计算,那么我建议您选择OpenCL。 SGX支持OpenCL EP 1.1。

答案 3 :(得分:1)

虽然在OpenGL ES2中无法从顶点着色器写入屏幕,但您可以从像素着色器执行此操作。

首先,您需要渲染到屏幕外缓冲区,然后您可以将其作为纹理渲染到屏幕上的另一个对象,或者您可以使用readPixels以常规方式将其读回。 https://gist.github.com/prabindh/9201855中提供了一个简单的步骤列表。