opengl:如何显示它所追踪的彗星和路径?

Vij*_*rma 1 opengl freeglut

我正在尝试使用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)

随着点数的增加,这会导致严重的性能下降,但可以显示移动平面以及点云.任何人都知道如何处理这种情况?

Sig*_*erm 6

是的,你清理屏幕并重新绘制所有内容.这就是有多少游戏引擎的工作原理.

然而,我还需要显示大量的点,这些点随着飞机的移动而不断累积.我尝试使用清晰的屏幕

你可能想要绘制太多的粒子.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)

你可以使用类似的东西来彗星踪迹.并添加一些小颗粒的火花或东西.也不要忘记纹理.使用纹理可以轻松添加更多细节,而不是尝试使用无纹理几何体绘制所有内容.

- 编辑 -

飞机的白色小道

实施任何类型的烟雾......

  1. 你需要使用具有"烟熏"/"混浊"纹理的非常大的纹理颗粒.如果你在谷歌图片谷歌"烟雾粒子纹理",你会看到我在说什么.
  2. 这些"大"粒子通常不能使用点精灵绘制(因为它可能比近距离的屏幕大)并且需要"广告牌".广告牌是一个总是面向相机的广场.
  3. 理想情况下,烟雾纹理的颜色通道应该是完全白色的(因此您可以使用顶点颜色为单个粒子着色),并且应该在alpha上绘制"烟雾".
  4. 烟雾颗粒在绘制时应按深度排序,并应从最远到最近(从相机)渲染.插入排序算法适用于"部分排序"数据.
  5. 应该在禁用深度写入的情况下渲染烟雾粒子(glDepthMask(0)如果我没记错的话)
  6. 烟雾颗粒应该使用glBlendFunc(GL_SRC_ALPHA, GL_INV_SRC_ALPHA)混合.
  7. 但是,如果烟雾中有火焰,则应使用火焰glBlendFunc(GL_SRC_ALPHA, GL_ONE).火焰颗粒应混合(即按深度与它们一起分类),或在烟雾后绘制(如果它使用单独的颗粒系统).
  8. 为了使烟雾逼真,为所有粒子分配小的初始速度,随着时间慢慢增加它们的大小,并使它们变得更加透明.当颗粒变得完全透明时,将它们从颗粒系统中移除.
  9. 绘制半透明alpha混合曲面时,启用alpha测试并使用alpha == 0切断像素.这将加快渲染速度.(重要的是,因为即使在合适的硬件上也可以杀死太多烟雾颗粒的帧率)
  10. 使用许多广告牌烟雾颗粒可能是昂贵的,特别是如果他们非常接近,所以如果你想用这种烟雾填充大面积,颗粒将变大并漂浮在眼睛水平,覆盖整个屏幕区域半透明表面多个您可能想研究一些其他体积雾技术.
  11. 不要使用矩阵移动单个粒子.每次调用不要绘制一个粒子.一次性绘制它们,这将更快.