我想用球体和圆柱体渲染一个弹簧。每个圆柱体的两端各有两个球体,所有圆柱体都沿弹簧中心线放置。我可以做到这一点…渲染效果很好。我目前正在使用gluSphere和gluCylinder。
现在,当我看到它的性能不是很好,它非常慢。所以我想知道以下是否可能:
是否有可能我把球体和圆柱体的表面结合起来,只渲染外壳,而不渲染球体的内部覆盖部分…
?我也读过关于VBOs ..有可能使用玻璃球和气缸与VBOs…?我不能使用显示列表,因为弹簧的属性一直在变化……
!有谁能提出更好的建议吗?您可能需要重新考虑绘制弹簧的方式。在我看来,有两种有效的方法。
-
使用Assimp或其他易于与OpenGL集成的模型加载软件加载弹簧模型。免费的3D模型可以在Turbo Squid或通过Google的3D仓库(而在Google Sketch-Up)找到。
-
纯粹在OpenGL中绘制对象。使用postfixed函数OpenGL pipeline绘制这类对象的惯用方法是绘制体积三维线。你画的线越多,你可以给你的弹簧更多的曲率,以渲染时间为代价。
对于绘制弹簧,我建议您定义一组点(带邻接)来定义弹簧的形状,并使用GL_LINE_STRIP_ADJACENCY基本类型绘制这些点。然后,在着色器程序中,使用几何着色器将这个像素绑定的线带扩展成一组由三角形带组成的体积三维线。
您最好的选择可能是在任何3D建模软件(想到Blender)中进行快速教程,然后使用CSG操作在其休息姿势中建模您的弹簧。
这种方法不仅使您摆脱了冗余的原语,而且使您的模型与vbo一起使用变得非常容易。你所要做的就是解析Blender的输出文件(最简单的是。obj),检索充满顶点数据(位置,法线,可能还有纹理坐标)的数组。
最后,要"动画"你的弹簧,你可以使用顶点着色器。你只需要传递另一个描述弹簧变形程度的均匀函数然后做剩下的变换