我正在使用实例化在opengl中渲染数百万个四边形,它运行良好。基本四边形有6个顶点,每个实例的位置都有一个vec3。但是,对于每个实例,我都需要根据实例的位置计算一些向量。如果我在顶点着色器中这样做,我会为每个实例计算这些向量6次。有没有一种方法可以在每个实例中只计算一次它们?
在有人提到几何着色器之前,我以前使用过几何着色器,但由于速度较慢,我改为实例化。也许有办法同时使用两者?它有益吗?
序言:不要使用实例化来渲染四边形。在各种硬件上,当实例的大小不是很小时,实例化效果最好。小型实例可能会浪费此类硬件的大量性能。
此外。。。为什么实例化的基础四边形会有6个不同的顶点(而不是共享2个的4个顶点(?如果要使用实例化,最好使用一个三角形条带,每个实例都是一个4元素条带。
至于你问题的主旨。。。没有。没有实例着色器,也没有办法让VS按实例而不是按顶点执行某些代码。
然而,你真的不应该对此感到紧张。如果计算是"基于实例的位置",那么这意味着主要的性能问题是读取每个实例的数据,而不是计算。GPU必须能够有效地处理读取相同内存地址的多个调用,因此可以假设从该地址读取4个调用不会比从该地址中读取1个调用慢多少。
所以接受它,继续前进。
如果我在顶点着色器中这样做,我会为每个实例计算6次这些向量。有没有一种方法可以在每个实例中只计算一次它们?
不在同一个绘图调用中。您可以在每个实例调用一次的情况下运行计算着色器预处理,并将每个实例的数据写入SSBO,稍后在绘图调用中将其用作具有每个实例属性的附加VBO。
然而,您可能正在针对错误的事情进行优化。每个实例只使用6个顶点可能会导致GPU资源的使用非常糟糕,并且不清楚每个顶点进行每个实例的计算是否真的比第二次通过更糟糕。