Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在OpenGL中使用顶点着色器中的计时器设置点大小的动画_Opengl_Timer_Shader_Point - Fatal编程技术网

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

如何在OpenGL中使用顶点着色器中的计时器设置点大小的动画,opengl,timer,shader,point,Opengl,Timer,Shader,Point,我正在尝试实现一个点云,其中不同的点的大小将根据与它们相关的不确定性值而有所不同。比方说,如果这个值为零,那么大小应该是恒定的,如果它接近1,那么这些点的半径应该变化越来越大。首先,点的大小应该增加,在达到最大值后,它们应该减少到最小值,依此类推。 描述这种现象的函数可以是: pointSize = x +/- c * pointUncertainty, where x = standard point size

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

pointSize = x +/- c * pointUncertainty, where x = standard point size 
                                              c = scaling constant
从我所读到的,这可能是通过将一个统一的计时器变量传递给我的顶点着色器并计算其中的点大小来实现的。但是,所有点应在同一时间发生变化,这意味着不确定度为1的点和不确定度为0.5的点应同时达到其点大小的最小值和最大值。另外,整个过程不应该依赖于帧速率

我不确定实现这一点的最佳方法是什么,如何最好地实现递增-递减-递增模式,以及在哪里放置必要的OpenGL 4.2命令

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

你可以传递一个带有每个点的值的a。然后使用来检索值。你可以使用一个if来使用OpenGL 4.2,或者这样做。还可以查看问题和一,公认的答案还提出了其他解决方案,如UBOs。 如果你的点云相当大,那么这就是你需要的

让我们采取以下方法:

您可以创建一个纹理缓冲区,并将其填充为 定义你的分数目标大小。阅读我上面的链接 设置它。 在顶点着色器中,您可以通过texelFetch采样访问这些值。正如我所说的,您可以使用gl_VertexID按当前顶点采样,如下所示:

 ... 
 "  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;"
 "  }"
 ...
统一采样缓冲点缓冲

真空总管 { float destSize=texelFetchpointsBuffer,gl_VertexID.x; ... }

现在,您可能希望根据一定量将点大小从默认值插值到目标值。是的,范围在0和1之间的计时器输入可以完成此任务。使用内置方法从默认值插值到目标值。有关更多有趣的基于正弦波或余弦波的时间:

正如您提到的OpenGL superbible,它有一章解释了纹理缓冲区是如何工作的。阅读它。您尝试做的不是火箭科学,也不是初学者。所以请耐心等待-这是使用OpenGL时的一个好提示

您可以通过a传递每个点的值。然后使用来检索值。您可以使用if来使用OpenGL 4.2或执行此操作。还可以查看问题1,接受的答案还建议其他解决方案,如UBOs。 如果你的点云相当大,那么这就是你需要的

让我们采取以下方法:

您可以创建一个纹理缓冲区,并将其填充为 定义你的分数目标大小。阅读我上面的链接 设置它。 在顶点着色器中,您可以通过texelFetch采样访问这些值。正如我所说的,您可以使用gl_VertexID按当前顶点采样,如下所示:

 ... 
 "  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;"
 "  }"
 ...
统一采样缓冲点缓冲

真空总管 { float destSize=texelFetchpointsBuffer,gl_VertexID.x; ... }

现在,您可能希望根据一定量将点大小从默认值插值到目标值。是的,范围在0和1之间的计时器输入可以完成此任务。使用内置方法从默认值插值到目标值。有关更多有趣的基于正弦波或余弦波的时间:

正如您提到的OpenGL superbible,它有一章解释了纹理缓冲区是如何工作的。阅读它。您尝试做的不是火箭科学,也不是初学者。所以请耐心等待-这是使用OpenGL时的一个好提示


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

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

 ... 
 "  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是统一变量。第一个是用GLUTGEGLUT ELASED时间设置的,第二个是任意数。

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

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

 ... 
 "  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是统一变量。第一个是用GLUTGEGLUT_ELASED_TIME设置的,第二个是任意数。

好的,这说明了如何将点大小数据放入着色器中,而不是如何实现动画效果。难道不可能只使用VBO将不确定性数据传递给t吗
他穿制服吗?我猜VBO中的值不必每帧都进行更改或计算。你读过我在这里的链接中的答案吗@Nicol Bolas打开了所有可能的选项。我确实阅读了你在答案中的所有链接,但我仍然不太清楚。也许是因为我几周前才开始学习opengl,或者是我太傻了,没法理解这个类比。在这两个链接中,问题是如何将数据传递到顶点着色器。我可能会使用您建议的上述缓冲区纹理。现在的问题是如何使用这些数据来设置点的动画。我不需要某种定时器变量来计算何时达到最大不确定性值以及何时再次收缩点大小吗?可能是缺乏OpenGL经验才是你在这方面感到困难的真正原因…我不能在这里给出完整的解决方案,因为StackOverflow的想法是帮助人们,而不是为他们做事它们。我建议的可能解决方案就是你所需要的。现在试着实现它们。我不想让任何人做我的事情,但正如我所说的,这种动画的整个过程对我来说是不清楚的……我花了几个小时在网上搜索关于这方面的任何像样的教程,但没有成功。我理解你建议的所有内容,但我看不出如何使用它们来实现我的点动画。如果你能多解释一下这个过程,我将不胜感激。目前,所有这些方法在我看来都是将数据传递到着色器的不同解决方案,但不确定性数据已经存在于VBO中。好的,这解释了我如何将点大小数据传递到着色器中,而不是如何实现动画效果。难道不可能只对不确定性数据使用VBO并将其作为统一的对象传递给着色器吗?我猜VBO中的值不必每帧都进行更改或计算。你读过我在这里的链接中的答案吗@Nicol Bolas打开了所有可能的选项。我确实阅读了你在答案中的所有链接,但我仍然不太清楚。也许是因为我几周前才开始学习opengl,或者是我太傻了,没法理解这个类比。在这两个链接中,问题是如何将数据传递到顶点着色器。我可能会使用您建议的上述缓冲区纹理。现在的问题是如何使用这些数据来设置点的动画。我不需要某种定时器变量来计算何时达到最大不确定性值以及何时再次收缩点大小吗?可能是缺乏OpenGL经验才是你在这方面感到困难的真正原因…我不能在这里给出完整的解决方案,因为StackOverflow的想法是帮助人们,而不是为他们做事它们。我建议的可能解决方案就是你所需要的。现在试着实现它们。我不想让任何人做我的事情,但正如我所说的,这种动画的整个过程对我来说是不清楚的……我花了几个小时在网上搜索关于这方面的任何像样的教程,但没有成功。我理解你建议的所有内容,但我看不出如何使用它们来实现我的点动画。如果你能多解释一下这个过程,我将不胜感激。目前,在我看来,所有这些方法都是将数据传递给着色器的不同解决方案,但不确定性数据已经存在于VBO中。