我正在尝试使用freeglut进行一些opengl编程.假设一个物体(彗星/飞机)在3D空间中移动,我希望将其描绘的路径渲染为点云(表示飞机留下的白色轨迹).
我的问题是,每次按顺序调用glutDispFunc时,我需要使用glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)清除屏幕,以便为飞机提供移动(我使用键盘功能来改变飞机的位置).然而,我还需要显示大量的点,这些点随着飞机的移动而不断累积.我尝试使用清晰的屏幕
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)
随着点数的增加,这会导致严重的性能下降,但可以显示移动平面以及点云.任何人都知道如何处理这种情况?
是的,你清理屏幕并重新绘制所有内容.这就是有多少游戏引擎的工作原理.
然而,我还需要显示大量的点,这些点随着飞机的移动而不断累积.我尝试使用清晰的屏幕
你可能想要绘制太多的粒子.100个粒子(或几百个,但不到一千个)应该足以绘制彗星踪迹.只需200个(BIG)粒子,您就可以创建非常有说服力的云.
此外,你不需要点来绘制彗星踪迹.使用alpha混合,您可以使用三角形轻松地绘制半透明的光剑状线条.
类似光剑,类似等离子的火焰状应该使用任何颜色和白色的小颜色(例如rgb 255,10,10),并且传统上使用 glBlendFunc(GL_SRC_ALPHA, GL_ONE)
这里有几个例子.示例显示您应该使用的三角形网格.数字表示alpha.0 - 完全透明,1 - 完全不透明.斜线表示必要时的三角测量."|" 和" - "表示脸部边缘:
发光线
0--0--0--0
| \| | /|
0--1--1--0
| /| | \|
0--0--0--0
repeat
0--0
| |
1--1
| |
0--0
to add more segments
Run Code Online (Sandbox Code Playgroud)
厚厚的发光线
0--0--0--0
| \| | /|
0--1--1--0
| | | |
0--1--1--0
| /| | \|
0--0--0--0
repeat
0--0
| |
1--1
| |
1--1
| |
0--0
to add more segments.
Run Code Online (Sandbox Code Playgroud)
你可以使用类似的东西来彗星踪迹.并添加一些小颗粒的火花或东西.也不要忘记纹理.使用纹理可以轻松添加更多细节,而不是尝试使用无纹理几何体绘制所有内容.
- 编辑 -
飞机的白色小道
实施任何类型的烟雾......
glDepthMask(0)
如果我没记错的话)glBlendFunc(GL_SRC_ALPHA, GL_INV_SRC_ALPHA)
混合.glBlendFunc(GL_SRC_ALPHA, GL_ONE)
.火焰颗粒应混合(即按深度与它们一起分类),或在烟雾后绘制(如果它使用单独的颗粒系统).