OpenGL渲染质量与顶点数

时间:2017-03-27 11:26:51

标签: c opengl 3d

我正在编写一个现代OpenGL应用程序来可视化化学和凝聚物理物理的3d原子模型(分子,周期系统......)。 几年前我开始研究,我的程序的第一个版本是旧的OpenGL,现在我将它更新为现代OpenGL。

我提出了一个关于OpenGL窗口渲染质量的问题。在下面的例子中,我使用实例绘制绘制3D圆柱体和3D球体,在此模型中渲染粘合我只绘制一个圆柱体,然后我在顶点着色器中正确平移/缩放/旋转它 渲染所有键,球体渲染原子也一样。 正如你所看到它工作得很好,方法的效率是惊人的,我可以平滑地渲染数十万个原子的模型。

然而我注意到一些奇怪的东西,不知何故渲染的质量似乎取决于场景中顶点(对象,原子和键)的数量,显然三角形的数量是最重要的参数但不是唯一的一个...因为当渲染了很多顶点时质量下降...请参阅附件快照:

要在场景中渲染球体,我使用的是50x50顶点,2x50用于圆柱体(在两种情况下都是GL_TRIANGLE_STRIP)

1)在这个测试模型中,我加载:96个原子,512个半键,:~291200个顶点:

Initial model box

2)我放大以聚焦于一个选定的原子及其周围,在这个尺度上,结果无可挑剔:

Zoom in initial model box

3)我重置视图并在程序中使用构建器来增加框数 (我只是在空间的3个方向做复制品)在这里我选择做20x20x20复制品, 看到下面的结果,原始框突出显示。 在那个场景中有768000个原子,4096000个半键,因此:291200x20x20x20 = 2329600000个顶点 相当多,但它有效,但出现了一些奇怪的东西......

New model: 20 x 20 x 20 boxes

4)我再次放大我之前选择的模型的特定区域,特别是质量下降 在3D物体(球体/圆柱体)叠加/重叠的区域......

Zoom in the 20 x 20 x 20 boxes model

有人可以向我解释一下我的看法吗?

注意1:在同一窗口中,我可以将副本数量减少回原始框,再次缩放 并且看到结果回归无可挑剔。

注意2:我的程序的旧版本仍然可以正常工作(旧的OpenGL,使用glutsphere和glutcylinders的显示列表), 我可以做同样的事情,渲染将花费更长的时间,但在我放大20x20x20的过程结束时 盒子模型,结果仍然很完美,就像单盒模型一样,显然我使用相同的显卡,驱动程序等。

1 个答案:

答案 0 :(得分:3)

  

有人可以向我解释一下我的看法吗?

您已经看到深度缓冲区的精度有限了。只有很多位可以使用,在透视投影中,应用了从Z距离到深度缓冲区值的线性缩放。

最佳行动方案是将透视投影矩阵的近/深度范围限制为在屏幕上实际可见的内容,以更好地利用深度缓冲。也可以线性化深度缓冲区(但这会带来性能损失)。此外,您可以尝试干净地交叉棒和球体相遇的几何形状,即将球体的顶点约束到圆柱体的表面,在那里棒和类似地约束棒状物。将顶点终止到它们相遇的球体。这样就可以避免重叠,从而避免这些伪影。