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

Posted

技术标签:

【中文标题】是否可以从顶点着色器读取数据?【英文标题】:is it possible to read data from vertex shader? 【发布时间】:2013-10-01 18:23:35 【问题描述】:

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

我可以读回数据并在 CPU 中检查吗?反正在opengl es中有吗?

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

【问题讨论】:

我不认为你可以用 es 2 做到这一点 相关***.com/questions/14086926/… 【参考方案1】:

读取顶点输出:查找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

【讨论】:

我看到变换反馈可以被捕获并多次反馈到顶点着色器中,但是它可以被读回CPU并被破译吗? 您将数据输出到缓冲区,因此您可以简单地映射缓冲区,但老实说我不确定。【参考方案2】:

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

【讨论】:

【参考方案3】:
"...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 参考:Reading the pixels values from the Frame Buffer Object (FBO) using Pixel Buffer Object (PBO)

如果您追求的是 GPGPU 计算,那么我建议您使用 OpenCL。 新交所支持 OpenCL EP 1.1。

【讨论】:

取决于 SOC 供应商提供 OpenCL 驱动程序支持。并非所有供应商都提供此功能。【参考方案4】:

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

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

【讨论】:

以上是关于是否可以从顶点着色器读取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在着色器之后读取像素?

从着色器读取数据

链接着色器导致文件未读取错误

Unity Shaders and Effects Cookbook (7-1) 在Surface Shader 中 访问 顶点颜色

如何将数据从顶点着色器传递到片段着色器,中间有着色器[重复]

DirectX11 With Windows SDK--26 计算着色器:入门