C++ 将纹理数据解释为顶点着色器中的顶点数据

C++ 将纹理数据解释为顶点着色器中的顶点数据,c++,opengl,graphics,glsl,gpu,C++,Opengl,Graphics,Glsl,Gpu,我尝试使用顶点着色器重新定位粒子(存储在纹理中),这些粒子将传递到Frag着色器并存储在单独的纹理中 我试图完全在GPU上实现高效的空间分块。这是用于SPH流体模拟的 是否可以将2D纹理的所有像素(Textel)传递给顶点着色器?每个textel(RGBA)将被重新解释为传入顶点(XYZW)。不可能假装2D纹理实际上是顶点数据。然而,我想知道你为什么要这样做 最有效的方法是不将粒子数据存储为纹理,而是将其存储为纹理。可以直接将缓冲区对象用作顶点阵列的源数据 鉴于“我将数据存储为纹理,因为粒子位

我尝试使用顶点着色器重新定位粒子(存储在纹理中),这些粒子将传递到Frag着色器并存储在单独的纹理中

我试图完全在GPU上实现高效的空间分块。这是用于SPH流体模拟的


是否可以将2D纹理的所有像素(Textel)传递给顶点着色器?每个textel(RGBA)将被重新解释为传入顶点(XYZW)。

不可能假装2D纹理实际上是顶点数据。然而,我想知道你为什么要这样做

最有效的方法是不将粒子数据存储为纹理,而是将其存储为纹理。可以直接将缓冲区对象用作顶点阵列的源数据



鉴于“我将数据存储为纹理,因为粒子位置是片段着色器的输出”,我可以提出一些更有用的建议:。这些是1D纹理,将其数据存储在缓冲区对象中。它们仍然可以用作渲染目标(尽管显然需要更改数据光栅化的方式,因为它们是1D渲染目标),但它们渲染的内容存储在缓冲区对象中

这样,您可以对缓冲区纹理进行渲染,然后将缓冲区绑定为一个数组,并从中获取源


如果您绝对必须渲染到2D纹理,则可以使用较慢的方法:PBO主要用于异步像素传输,因此我建议在执行
glGetTexImage
到缓冲区和调用
glDrawArrays
从缓冲区进行渲染之间,给GPU一些其他操作。否则,您将暂停GPU。

不可能假装2D纹理实际上是顶点数据。然而,我想知道你为什么要这样做

最有效的方法是不将粒子数据存储为纹理,而是将其存储为纹理。可以直接将缓冲区对象用作顶点阵列的源数据



鉴于“我将数据存储为纹理,因为粒子位置是片段着色器的输出”,我可以提出一些更有用的建议:。这些是1D纹理,将其数据存储在缓冲区对象中。它们仍然可以用作渲染目标(尽管显然需要更改数据光栅化的方式,因为它们是1D渲染目标),但它们渲染的内容存储在缓冲区对象中

这样,您可以对缓冲区纹理进行渲染,然后将缓冲区绑定为一个数组,并从中获取源


如果您绝对必须渲染到2D纹理,则可以使用较慢的方法:PBO主要用于异步像素传输,因此我建议在执行
glGetTexImage
到缓冲区和调用
glDrawArrays
从缓冲区进行渲染之间,给GPU一些其他操作。否则,您将暂停GPU。

如果硬件支持,可以将2D纹理传递给顶点着色器。您可以使用以下代码对此进行测试:

int maxVertexTextureImageUnits;
glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVertexTextureImageUnits);
如果
MaxVertextureImageUnits
为零,则不支持此功能

您不会直接将纹理作为顶点数据传入,而是创建顶点网格,其坐标对应于纹理中每个像素的纹理坐标。然后在顶点着色器中,使用这些顶点读取片段着色器中生成的实际顶点坐标(texel值)。然后使用这些参数计算
gl\u位置


我从未亲自使用过此功能(我的平台不支持),但我看到了它的酷炫粒子/流体演示。我认为对它的支持是相当参差不齐的。即使在支持它的硬件上,驱动程序也可能无法实现它。

如果硬件支持,也可以将2D纹理传递给顶点着色器。您可以使用以下代码对此进行测试:

int maxVertexTextureImageUnits;
glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVertexTextureImageUnits);
如果
MaxVertextureImageUnits
为零,则不支持此功能

您不会直接将纹理作为顶点数据传入,而是创建顶点网格,其坐标对应于纹理中每个像素的纹理坐标。然后在顶点着色器中,使用这些顶点读取片段着色器中生成的实际顶点坐标(texel值)。然后使用这些参数计算
gl\u位置


我从未亲自使用过此功能(我的平台不支持),但我看到了它的酷炫粒子/流体演示。我认为对它的支持是相当参差不齐的。即使在支持它的硬件上,驱动程序也可能无法实现它。

是的,这很简单:只渲染尽可能多的顶点,但不绑定顶点缓冲区。相反,通过获取顶点ID(
gl_VertexID
)来计算与当前顶点对应的像素(您应该渲染为点)。从顶点ID,您可以对纹理进行提取并获取数据(确保使用
texelFetch

是的,很简单:只要渲染尽可能多的顶点即可,但不要绑定顶点缓冲区。相反,通过获取顶点ID(
gl\u VertexID
)计算与当前顶点对应的像素(您应该渲染为点)。从顶点ID,您可以对纹理进行提取并获取数据(确保使用
texelFetch

您使用了哪些工具来执行此操作?试着用这个工具的名字来标记你的问题,可能还有其他一些紧密相关的标签。你用什么工具来做这件事?试着用该工具的名称标记你的问题,可能还有其他一些紧密相关的标记。我将数据存储为纹理,因为粒子位置是片段着色器的输出。@JohnD:那么你应该提到这一点。我只能根据你说的而不是你的想法给出建议。查看我的编辑。完全可以在纹理中存储顶点。这里有一个例子,我是