opengl - 你能计算每个实例而不是每个顶点的东西吗?

标签 opengl graphics glsl

我正在使用实例化在 opengl 中渲染数百万个四边形,并且效果很好。基础四边形有 6 个顶点,每个实例都有一个 vec3 来表示其位置。然而,对于每个实例,我需要根据实例的位置计算一些向量。如果我在顶点着色器中执行此操作,我将为每个实例计算这些向量 6 次。有没有办法每个实例只计算一次?

在有人提到几何着色器之前,我之前使用过几何着色器,但我切换到实例化,因为它很慢。也许有办法同时使用两者?它有好处吗?

最佳答案

序言:不要通过实例渲染四边形。实例化,on various hardware ,当实例的大小不是非常小时,效果最佳。小型实例可能会降低此类硬件的大量性能。

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

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

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

所以,接受它并继续前进。

关于opengl - 你能计算每个实例而不是每个顶点的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60460750/

相关文章:

opengl - 如何设置和使用持久帧缓冲区对象来进行独特的颜色选择?

computer-vision - 合并照片纹理 -(来自校准的相机) - 投影到几何体上

c++ - 无法在 OpenGL 中获取 GLSL 着色器

c++ - 通过 texture2D 函数使用自动比较从阴影贴图纹理中采样数据

opengl - 有没有办法识别我正在操作的 OpenGL 上下文?

c++ - glutMotionFunc '' 翻转”问题

c++ - SDL 混合导致不正确的帧插值

c++ - 刷新 QGraphicsScene/QGraphicsView

opengl - OpenGL 3 中的图像加载存储等效项

glsl - 将着色器源与应用程序捆绑在一起?