如何使用计时器的顶点着色器内的动画在OpenGL点大小(How to use a timer ins

2019-07-17 21:59发布

我想实现一个点云,其中的不同点应在规模基础上与它们相关联的不确定性值会有所不同。 比方说,如果该值是零,大小应该是恒定的,如果它接近1,这些点的半径应该因人而异越来越多。 首先,点应获得的规模和达到最大值之后,他们应该减少,直到最小的,等等。 来形容这种现象的一个功能可以是:

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

从我读过的东西,这可能被传递一个统一的定时器变量到我的顶点着色器来实现,并在那里计算点大小。 然而,所有的点应当以相同的时间而变化,这意味着其具有为1的不确定性,并且具有0.5的不确定性应在同一时间到达的pointsize的它们的最小和最大值的点的点。 另外,整个过程不应该依赖于的帧速率。

我不知道什么是得到的最好的方式完成这件事时,增加,减少,增加模式中如何实现最好,哪里放置必要的OpenGL(4.2)命令。

编辑:我还是希望得到一个回答这个问题,因为这样的动画效果怎么样才能实现整个过程我不清楚。

Answer 1:

你可以通过一个texture1D为每个point.Then使用的值texelFetch()来检索values.You可以使用原子计数器 (如果使用的OpenGL 4.2),或gl_vertexID做this.Also看看这个问题, 这一个公认的答案也建议像UBOs额外的解决方案。 但如果你的点云是相当大的,然后缓冲纹理是你所需要的。

让我们以缓冲纹理的方法:

  • 您创建一个纹理缓存,并与去定义你的目标点的大小值填充它。(阅读,我把上面的链接如何设置它。
  • 在顶点着色器可以访问通过texelFetch采样。正如我说的那些价值观,你可以使用gl_VertexID由当前顶点,(像这样)采样:

    均匀samplerBuffer pointsBuffer;

    无效的主要(){浮动destSize = texelFetch(pointsBuffer,gl_VertexID).X; ...}

  • 现在,你可能想插从默认到基于一些amount.Yes定时器输入取值范围在0和1之间可以做job.Use目标大小点大小组合()内置的方法来插值点大小从默认的destination.For更多的乐趣通SIN()或COS()基于时间:)

  • 正如你所提到的OpenGL OpenGL超级,它有一章介绍了如何纹理缓冲器work.Read它再次 。什么,你正在试图做的是不是一个火箭科学,但不是一个初学者的水平either.So耐心-其总是很好的提示时, OpenGL的工作。



Answer 2:

首先,...感谢你的答案。 我只用一个顶点着色器工作的事情了。 我想这是我希望得到的解决方案。 也许有同样问题的人可以从中受益:

我的顶点着色器的部分看起来是这样的:

 ... 
 "  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),第二个是任意数。



文章来源: How to use a timer inside a vertex shader to animate point sizes in OpenGL