如何在顶点着色器中使用计时器来为OpenGL中的点大小设置动画

时间:2013-01-06 22:11:51

标签: opengl timer shader point

我正在尝试实施一个点云,其中不同点的大小会根据与它们相关的不确定性值而变化。假设,如果该值为零,则大小应该是常数,如果它接近1,那么这些点的半径应该变化越来越大。首先,点数应该增加,在达到最大值后,它们应该减少到最小值,依此类推。 描述这种现象的功能可能是:

pointSize = x +/- c * pointUncertainty, where x = standard point size 
                                              c = scaling constant

从我读过的内容中,可以通过将一个统一的计时器变量传递给我的顶点着色器并计算其中的点大小来实现。但是,所有点应该在同一时间内变化,这意味着具有不确定性1的点和具有0.5的不确定性的点应该同时达到pointSize的最小值和最大值。此外,整个过程不应该取决于帧速率。

我不确定完成此操作的最佳方法是什么,如何最好地实现增加 - 减少 - 增加 - 模式以及在何处放置必要的OpenGL(4.2)命令。

编辑:我仍然希望得到这个问题的答案,因为我不清楚如何实现这种动画效果的整个过程。

1 个答案:

答案 0 :(得分:1)

首先......感谢您的回答。我只使用顶点着色器来解决问题。我想这是我希望得到的解决方案。也许有同样问题的人可以从中受益:

我的顶点着色器的一部分如下所示:

 ... 
 "  float standardPointSize = 100.0;"
 "  float timeScale = standardPointSize / my_loopDuration;"
 "  float currentTime = mod(my_time, my_loopDuration);"
 "  float offset = currentTime * timeScale * in_uncertainty;"
 "  if(currentTime < my_loopDuration / 4)"
 "  {"
 "      gl_PointSize = standardPointSize - 4 * offset;"
 "  }"
 "  else if(currentTime >= my_loopDuration / 4 && currentTime < my_loopDuration / 2)"
 "  {"
 "      gl_PointSize = standardPointSize - standardPointSize * in_uncertainty + 4 * offset - 1 * in_uncertainty * standardPointSize;"
 "  }"
 "  else if(currentTime >= my_loopDuration / 2 && currentTime < 3 * my_loopDuration / 4)"
 "  {"
 "      gl_PointSize = standardPointSize + 4 * offset - 2 * in_uncertainty * standardPointSize;"
 "  }"
 "  else if(currentTime >= 3 * my_loopDuration / 4 && currentTime <= my_loopDuration)"
 "  {"
 "      gl_PointSize = standardPointSize + standardPointSize * in_uncertainty - 4 * offset + 3 * in_uncertainty * standardPointSize;"
 "  }"
 ...

my_time和my_loopDuration是统一变量。第一个是用glutGet(GLUT_ELASED_TIME)设置的,第二个是任意数字。