我正在尝试使用顶点着色器来重新定位粒子(存储在纹理中),这些粒子被传递到Frag着色器并存储在单独的纹理中。
我正在尝试完全在GPU上实现高效的空间分库。这是针对SPH fluid sim的。
是否可以将2D纹理的所有像素(文本元素)传递给顶点着色器?每个纹理元素(RGBA)将被重新解释为传入顶点(XYZW)。
发布于 2012-02-20 08:26:38
无法假装2D纹理实际上是顶点数据。然而,我想知道你为什么要这样做。
执行此操作的最有效方法是不将粒子数据存储为纹理,而是存储在buffer objects中。可以直接使用buffer对象作为顶点数组的源数据。
给定“我将数据存储为纹理,因为粒子位置是碎片着色器的输出”,我可以建议使用更有用的方法:buffer textures。这些是将其数据存储在缓冲区对象中的一维纹理。它们仍然可以用作渲染目标(尽管显然您需要更改栅格化数据的方式,因为它们是一维渲染目标),但它们渲染的内容存储在buffer对象中。
这样,你就可以对buffer纹理进行渲染,然后将buffer绑定为数组并从中获取源。
如果你一定要渲染到2D纹理,你可以使用一种较慢的方法: GPU主要用于异步像素传输,所以我建议让read from the texture into a buffer object.在你向缓冲区执行glGetTexImage和调用glDrawArrays从缓冲区渲染之间做一些其他的事情。否则,你只会让GPU停滞。
发布于 2012-04-09 04:59:29
如果硬件支持Vertex Texture Fetch,则可以将2D纹理传递给顶点着色器。您可以使用以下代码对此进行测试:
int maxVertexTextureImageUnits;
glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVertexTextureImageUnits);如果maxVertexTextureImageUnits为零,则不支持此功能。
您不会直接将纹理作为顶点数据传递,而是创建一个顶点网格,其坐标对应于纹理中每个像素的纹理坐标。然后,在顶点着色器中,使用这些顶点读取在片段着色器中生成的实际顶点坐标(纹素值)。然后使用这些参数来计算gl_Position。
我从未亲自使用过此功能(在我的平台上不受支持),但我见过使用它的很酷的粒子/流体演示。我相信它的支持是相当参差不齐的。即使在支持它的硬件上,驱动程序也可能无法实现它。
发布于 2012-04-09 05:03:10
是的,这很简单:只需渲染与像素一样多的顶点,但不要绑定顶点缓冲区。相反,应通过获取顶点ID (gl_VertexID) (应渲染为点)来计算与当前顶点对应的像素。通过顶点ID,可以对纹理发出fetch并获取数据(请确保使用texelFetch。)
https://stackoverflow.com/questions/9354451
复制相似问题