粒子系统应该在几何着色器中完全更新还是应该为几何着色器传递位置和生命周期的更新数据。目前,我更新了几何体中的所有内容,但我不确定这是否是在C++中需要某些数据的最佳想法。粒子系统是否应该在几何着色器中完全更新
回答
几乎所有的着色器都可以使用(特别是如果你打算使用SM4 +)。如果您需要任何市场渗透,我不建议为SM3做任何事情。我仍然很遗憾,我们没有为我们的最新游戏提供SM2后备,因为不少人仍然使用老旧的SM2卡。
更多关于这个问题。您可以使用RTT,并且永远不要往返回主内存(这很慢,尽量减少从图形内存到主内存的传输),但不利的一面是,您需要使用一些相当复杂的技巧来计算AABB (如果你使用纯粹的GPU,你会希望在CPU的一面)。
相反,我们所做的一切都需要改变CPU端粒子的状态。然后,我们将获得更新到GPU的数据的紧张内存表示。顶点着色器相当有趣(但是完全正确,在顶点着色器中尽可能多地做到!),它会提取粒子的压缩表示,转换它,并将未压缩的数据传递给像素着色器。这里一个重要的观察结果是,您可以并且应该按照每个粒子数据分割每个顶点&。这意味着使用实例化(这只是一种说法:使用分频器)。我们用正常+正常的旋转表示粒子旋转。
做粒子CPU端状态改变的另一个原因是复合行为CPU端更容易。任何至少有一半体面的粒子系统需要相当多的旋钮才能创造有趣的粒子效应。
编辑:如果你有任何类似的粒子::更新,不能内联你失败了,最小化每个粒子函数调用,特别是虚拟的,并保持一个粒子的内存表示紧密包装!
这取决于你有什么样的粒子系统。在大多数情况下,你有一个C++的软件表示和一个着色器的硬件表示。着色器的几何数据是从软件表示中计算出来的,应尽可能少。因为在大多数情况下,计算能力不是限制资源,而是图形卡的传输速率。
如果您可以使用您的方法进一步减少传输,您仍然可以在内存中保留软件表示以供进一步使用。即使这意味着两次计算数据,它可能比传输过程更快。
我的粒子系统以烟,火,尘埃,雨等形式出现。此刻,我发送随机x和z值到着色器的位置和速度等我也通过粒子的帧时间和生命周期。然后,我的着色器会计算出粒子应该基于哪些值进入的位置。您是否会在软件中执行这些计算? – RobBain85 2012-03-06 16:28:07
也许我误解了你......但是当你发送随机位置和速度时,你的粒子会闪烁,对吗?或者这些值只计算一次,只有帧时间得到更新?在那种情况下,只有确定性的运动是可能的。 – 2012-03-06 16:34:50
对不起,是的,当粒子不再被重复使用时,它们被应用 – RobBain85 2012-03-06 16:41:23
- 1. 粒子系统的顶点着色器
- 2. (渲染粒子)我应该学习着色器还是OpenCL?
- 3. 统一Shuriken:使粒子系统完全规模
- 4. 粒子系统
- 5. AndEngine粒子系统
- 6. SFML.NET粒子系统
- 7. 粒子系统libGDX
- 8. 粒子系统DontDestroyOnLoad
- 9. 如何给粒子系统
- 10. libGdx中的粒子系统
- 11. 统一3d - 粒子系统
- 12. 粒子系统:粒子生成
- 13. 如何将粒子系统附加到对撞机或者如何使用角色移动粒子系统
- 14. Three.js - 应用着色器模糊几何
- 15. SFML粒子系统架构
- 16. 粒子系统错误
- 17. C++粒子系统Allegro 5
- 18. XNA粒子系统性能
- 19. 粒子系统设计?
- 20. OpenGL的粒子系统
- 21. 自定义粒子系统
- 22. OGRE - 创建粒子系统
- 23. 直通几何着色器
- 24. 文档安全系统 - 我是否在重新创造轮子?
- 25. 如何使用粒子对象优化画布粒子系统
- 26. 粒子系统中的粒子表现怪异
- 27. 如何获得粒子系统之一?
- 28. 如何使粒子系统可点击
- 29. 如何停止粒子系统
- 30. 2d中的粒子系统入门
Ahh辉煌的回复,这对我很有意义。我的下一个任务是实现软粒子,这就是为什么我需要问这个问题,因为如果你正在做纯粹的GPU,它不会让我觉得你可以很容易地进行深度排序。我现在可以更改我的代码,以反映您非常感谢的内容 – RobBain85 2012-03-06 16:35:19