能否从顶点着色器中读取数据?

6
我正在尝试编写一个简单的GPGPU基准测试。将数据加载到顶点缓冲区数组中,在顶点着色器中进行一些计算,然后读取数据。这是否可能?我计划在SGX GPU上运行此程序。
有没有办法做到这一点?我不希望它经过转换、裁剪、平铺和像素处理。这会增加额外的开销并改变我的数据。
我能否读取数据并在CPU中检查它?在OpenGL ES中是否有任何方法?
我也可以在像素着色器中进行计算,通过纹理发送数据并与某些常量相乘,然后将其写入另一个帧缓冲区。但是如何获取数据呢?我真的不想将其显示在屏幕上。 是否有任何方法可以实现这一点?如果有教程,请问有人能指导我吗?

我认为你不能用ES 2来完成这个。 - Jerome Baldridge
相关:https://dev59.com/-2Yq5IYBdhLWcg3w7E0F - Ciro Santilli OurBigBook.com
4个回答

5

我看到变换反馈可以被捕获并多次反馈到顶点着色器中,但它能否被读回到CPU并被解密? - sai pallavi
你可以将数据输出到缓冲区,因此你可以简单地映射缓冲区,但说实话我不太确定。 - fen

3

在OpenGL ES 2.0中,您无法直接从顶点着色器读取数据。 因此,您可以将数据发送到像素/片段着色器,在Frame Buffer Object(FBO)上附加它,然后使用glReadPixels将数据作为纹理传输到CPU。 这个链接描述了概念和代码片段:这里。 希望这可以帮助您。


2
"...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规范中没有包括这样的功能)。
“我可以在CPU中读取数据并检查吗?有没有OpenGL ES的方法?” 您可以使用帧缓冲对象,并使用glRead API读取相同的内容。您可以在这里阅读关于FrameBuffer Objects的信息:
参考:http://en.wikipedia.org/wiki/Framebuffer_Object 参考:使用Pixel Buffer Object(PBO)从帧缓冲对象(FBO)中读取像素值 如果您需要进行GPGPU计算,则建议您使用OpenCL。SGX支持OpenCL EP 1.1。

这取决于SOC供应商是否提供OpenCL驱动程序支持。并非所有供应商都提供此功能。 - Prabindh

1

在OpenGL ES2中,无法从顶点着色器写入离屏区域,但可以从像素着色器进行。首先需要渲染到离屏缓冲区,然后可以将其作为纹理呈现到屏幕上的另一个对象上,或者可以使用常规方法使用readPixels读取它。https://gist.github.com/prabindh/9201855提供了一系列简单的步骤。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接