我正在尝试编写一个简单的GPGPU基准测试。若要将数据加载到顶点缓冲区数组中,请在顶点着色器中进行一些计算,然后读回数据。可能吗?我计划在SGX GPU上运行它。
有什么办法可以做到这一点吗?我不希望它经历转换、裁剪、平铺阶段和像素处理。这会产生额外的开销,并更改我的数据。
我可以回读数据并在 CPU 中检查它吗? OPENGL ES中到底有吗?
我也可以在像素着色器中进行计算,方法是通过纹理发送数据并与一些常量相乘并将其写入另一个帧缓冲区。 但是我该如何取回呢? 我真的不想把它呈现在屏幕上。 有没有办法这样做?如果有的话,有人可以指出我一些教程吗?
读取顶点输出:寻找转换反馈 - 但你必须有OpenGL ES 3.0才能使用它。
对于 ES2.0,我建议使用片段着色器和渲染到纹理技术。这是一些教程链接渲染到纹理后,您基本上必须读取纹理的像素。
关于在这里读取数据的好教程
关于反馈的教程:http://open.gl/feedback
您无法直接在 OpenGL ES 2.0 中从顶点着色器读取数据。因此,您可以将数据保存到像素/片段着色器,将其附加到帧缓冲区对象(FBO),然后使用glReadPixel将数据作为CPU中的纹理获取。此链接描述了概念和代码 snnipet:这里。希望这可能会有所帮助。
"...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读取相同的对象。您可以在此处阅读有关帧缓冲区对象的信息
参考: http://en.wikipedia.org/wiki/Framebuffer_Object参考:使用像素缓冲区对象 (PBO) 从帧缓冲区对象 (FBO) 读取像素值
如果您追求GPGPU计算,那么我建议您选择OpenCL。新交所支持OpenCL EP 1.1。
OpenGL ES2 中无法从顶点着色器写入屏幕外,但您可以从像素着色器执行此操作。
首先,您需要渲染到屏幕外缓冲区,然后可以将其作为纹理渲染到屏幕上的另一个对象,或者您可以使用通常的方式使用 readPixel 将其读回。https://gist.github.com/prabindh/9201855 给出了一个简单的步骤列表。