Opengl 你能计算每个实例,而不是每个顶点吗?

Opengl 你能计算每个实例,而不是每个顶点吗?,opengl,graphics,glsl,Opengl,Graphics,Glsl,我使用实例在opengl中渲染了数百万个四边形,效果很好。基本四边形有6个顶点,每个实例的位置都有一个vec3。但是,对于每个实例,我需要根据实例的位置计算一些向量。如果我在顶点着色器中这样做,我将为每个实例计算这些向量6次。有没有办法在每个实例中只计算一次 在任何人提到几何体着色器之前,我以前使用过几何体着色器,但我切换到实例化,因为它很慢。也许有一种方法可以两者兼用?它有益吗 如果我在顶点着色器中这样做,我将为每个实例计算这些向量6次。有没有办法在每个实例中只计算一次 不是在同一个抽签通知中

我使用实例在opengl中渲染了数百万个四边形,效果很好。基本四边形有6个顶点,每个实例的位置都有一个vec3。但是,对于每个实例,我需要根据实例的位置计算一些向量。如果我在顶点着色器中这样做,我将为每个实例计算这些向量6次。有没有办法在每个实例中只计算一次

在任何人提到几何体着色器之前,我以前使用过几何体着色器,但我切换到实例化,因为它很慢。也许有一种方法可以两者兼用?它有益吗

如果我在顶点着色器中这样做,我将为每个实例计算这些向量6次。有没有办法在每个实例中只计算一次

不是在同一个抽签通知中。您可以在每个实例一次调用的情况下运行计算着色器预过程,并将每个实例数据写入SSBO,稍后在draw调用中将其用作具有每个实例属性的附加VBO


然而,您可能在这里优化了错误的东西。每个实例仅使用6个顶点可能会导致GPU资源的使用非常糟糕,并且不清楚每个顶点的每个实例计算是否真的比第二次通过更糟糕。

序言:不要使用实例渲染四边形。当实例的大小不是非常小时,实例化效果最好。在这样的硬件上,小实例可能会损失很多性能

还有。。。为什么实例化的基础四边形有6个不同的顶点(而不是共享2个顶点的4个顶点)?如果要使用实例,最好使用三角形条带,每个实例都是4元素条带

至于你问题的主旨。。。没有。没有实例着色器,也没有办法让VS在每个实例而不是每个顶点上执行一些代码

然而,你真的不应该为此而紧张。如果计算是“基于实例的位置”,那么这意味着主要的性能问题是读取每个实例的数据,而不是计算。GPU必须能够有效地处理读取相同内存地址的多个调用,因此您可以假设从该地址读取4个调用不会比从该地址读取1个调用慢多少

所以,接受它,继续前进