Opengl 大型模型上的逐顶点着色与逐片段着色

Opengl 大型模型上的逐顶点着色与逐片段着色,opengl,glsl,Opengl,Glsl,我是GLSL新手,正在编写一个小应用程序,它将显示一个3d模型,并有一些用户输入来旋转、缩放等。这些模型相当大(例如600万个顶点,1500万个面)。现在,我使用逐顶点着色,在我的个人电脑上性能还可以。但我可能需要使用更大的模型(有1000-1500万个顶点) 我的问题与逐顶点和逐片段着色之间的性能比较有关。从大量资源以及搜索网络中,我得出结论:每个片段都是着色,具有更好的输出,特别是对于镜面反射高光,但其性能较低,因为它对多边形的每个像素而不是每个顶点进行计算(如逐顶点着色) 也许我的想法是完

我是GLSL新手,正在编写一个小应用程序,它将显示一个3d模型,并有一些用户输入来旋转、缩放等。这些模型相当大(例如600万个顶点,1500万个面)。现在,我使用逐顶点着色,在我的个人电脑上性能还可以。但我可能需要使用更大的模型(有1000-1500万个顶点)

我的问题与逐顶点和逐片段着色之间的性能比较有关。从大量资源以及搜索网络中,我得出结论:每个片段都是着色,具有更好的输出,特别是对于镜面反射高光,但其性能较低,因为它对多边形的每个像素而不是每个顶点进行计算(如逐顶点着色)


也许我的想法是完全错误的,但是如果顶点计数很大,我是否应该期望每片段着色运行得更快,例如在我的例子中(600-1000万个顶点)?每个片段着色的性能是否取决于绘制到屏幕上的像素数,而每个顶点着色则不是?

片段着色的性能取决于在屏幕上绘制的片段数,包括那些由于某些三角形重叠其他三角形而绘制两次或两次以上的片段。 Z缓冲可以在某种程度上减少透支,但并不完美。延迟(或光预处理)着色在相对便宜的Z过程中可能仍然会过度,但或多或少会使实际着色部分严格与屏幕区域成比例,而不管某些三角形是否重叠(或重叠的三角形数量)

顶点着色(和后续阶段)的性能主要取决于顶点的数量(以及一些其他细节,如果几何体着色器或细分着色器处于活动状态)。一般来说,目前大多数应用不受顶点处理的限制。数百万个顶点本身通常不是问题(当然,不绘制看不见的顶点总是更好)。
但是,随着三角形变小(接近2x2碎片四元体的大小),作为次要效果,更高的顶点数会导致额外的碎片着色工作(当然还有组装/光栅化工作和ROP),而视觉质量没有任何改善,有时甚至会因时间混叠而导致质量降低。
这与实际处理的顶点数量无关,而是与单个三角形的屏幕面积变小有关


因此,您应该有一个LOD(详细等级)系统,以确保没有太多太小的三角形(例如在远处的要素上),如果这些大型模型是建筑物或诸如此类的话,你可能会考虑一个门户系统来截除不影响可见结果的整个几何层次。理论上,如果你有6百万个子碎片(子像素)三角形,碎片遮蔽会更快,因为它永远不会被执行。而几何体/顶点处理将一直进行(不做任何事情比做某些事情快)。所以它延续了“不要画任何对结果图像没有影响的东西”的想法。不一定,光栅化器会为三角形“接触”的每个光栅网格单元生成一个片段(必须至少有一个)。不幸的是,没有一个片段这样的东西存在。这意味着像素着色器针对2x2组片段运行(这是必要的a)因为硬件就是这样构建的,b)因为导数计算)。因此,3个顶点产生4个着色片段(可能带有纹理查找等),这些片段对视觉质量没有任何影响,最终被丢弃或权重太低,以至于它们的贡献不可见。在最坏的情况下,片段大小(或更小)的三角形会接触3个属于3个不同2x2屏幕四边形的片段。现在,3个顶点会导致12个片段被着色,但它们什么都不做…使用多重采样-可能,但没有多重采样-它们应该在片段着色器执行之前被丢弃,因为着色器无法更改任何内容来阻止丢弃,所以这种测试比较早。但这肯定不是保证,只是硬件中常见的性能优化。大约2x2-准确地说,它可能更大(我记得有些图形卡有4x4执行四元组)。有时,这取决于。严格按照标准,深度测试在片段着色器之后进行。但是,如果未修改深度,则实现可以使用插值深度并在之前进行测试。此外,如果缓冲区已被正确清除,并且测试条件在帧中没有反转,那么现在大多数实现将执行分层深度测试,以便更早地拒绝片段。为了获得最佳效果,您需要清除深度缓冲区(而不是覆盖),并首先绘制距离最远的大遮罩。