gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:15:40 24 4
gpt4 key购买 nike

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

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

根据我的阅读,这可能通过将统一计时器变量传递到我的顶点着色器并在其中计算点大小来实现。但是,所有点应该同时变化,这意味着不确定性为 1 的点和不确定性为 0.5 的点应该同时达到它们的最小值和最大值 pointSize。此外,整个过程不应依赖于帧速率。

我不确定完成这项工作的最佳方法是什么,增加-减少-增加模式的最佳实现方式以及放置必要的 OpenGL (4.2) 命令的位置。

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

最佳答案

你可以传递一个 texture1D与每个点的值。然后使用 texelFetch()检索值。您可以使用 atomic counter (如果使用 OpenGL 4.2),或 gl_vertexID做到这一点。也看看this问题和this第一,接受的答案还建议其他解决方案,如 UBO。虽然如果你的点云很大那么Buffer Textures正是您所需要的。

让我们以Buffer textures为例方法:

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

    uniform samplerBuffer pointsBuffer;

    无效主() { float destSize = texelFetch(pointsBuffer, gl_VertexID).x; ...

  • 现在,您可能希望根据一些数量将点大小从默认值插入到目标大小。是的,范围在 0 到 1 之间的计时器输入可以完成这项工作。使用 mix()内插 point size 的内置方法从默认的目的地开始。为了获得更多乐趣,请传递基于时间的 sin() 或 cos() :)

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

关于opengl - 如何在顶点着色器中使用计时器在 OpenGL 中设置点大小的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com