OGL 4+;/GLSL/C++;-拖尾行星轨道 我正在研究一个太阳系模拟器,现在正在尝试如何在C++和OpenGL/GLSL中做尾随轨道,看起来与此类似:

OGL 4+;/GLSL/C++;-拖尾行星轨道 我正在研究一个太阳系模拟器,现在正在尝试如何在C++和OpenGL/GLSL中做尾随轨道,看起来与此类似:,c++,opengl,glsl,vbo,C++,Opengl,Glsl,Vbo,问题是,我没有静态轨道,行星的位置每一帧都会更新 所有行星都是从一个类实例化的。我有办法做到这一点,但不确定它在技术上是否可行 请给出建议(无论是为了改进我的想法还是为了更好的东西) 概念: 有一个具有特定顶点数据集的VBO,例如8个顶点 创建描述每个连续点之间链接的IBO 这个想法是要有一个垂直运动的“跑步机”,其中第一个垂直运动伴随着行星: IBO : [ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 ] ---------------^使glsl仅更新vbo中的第一个元素,

问题是,我没有静态轨道,行星的位置每一帧都会更新

所有行星都是从一个类实例化的。我有办法做到这一点,但不确定它在技术上是否可行

请给出建议(无论是为了改进我的想法还是为了更好的东西)

概念

  • 有一个具有特定顶点数据集的VBO,例如8个顶点
  • 创建描述每个连续点之间链接的IBO
  • 这个想法是要有一个垂直运动的“跑步机”,其中第一个垂直运动伴随着行星:

    IBO : [ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 ]
    
    ---------------^使glsl仅更新vbo中的第一个元素,这意味着在vbo中:

    VBO : [ v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 ]
    
    VBO : [ v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 ]
    
    ---------------^要为每个渲染调用更新的当前顶点

  • 当行星&v1从v2移动一个设定的距离D时
  • 将最后一个顶点位置设置为下一个动态观察位置,即在链中向前移动:

    IBO : [ 8 | 1 | 2 | 3 | 4 | 5 | 6 | 7 ]
    
    ---------------^要更新的当前索引,在vbo中表示:

    VBO : [ v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 ]
    
    VBO : [ v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 ]
    
    -------------------------------------------------------------------------^要为每个渲染调用更新的当前顶点

    这有什么意义吗?我真的很喜欢重复使用vertecies的想法,给它们一个生命周期(褪色),然后。。那会重新链接吗?甚至可以在GPU级别操纵索引缓冲区吗


    也许我的思想只是陷入了一条愚蠢的胡同,也许这里有人有更好的主意?

    我真的不明白你想用这个代码做什么,但据我所知,当你改变IBO时,你实际上改变了组成几何体的三角形的顺序,如果你在设置行星位置的动画方面遇到了问题,那么解决方案是非常先进的

    for each planet
    {
    glUniformMatrix4fv(matLocation, 1, GL_FALSE/*Or GL_TRUE depends on you implementation*/, planet.getModelMatrix());
    planet.Render();
    }
    
    顶点着色器看起来像:

    ...
    uniform mat4 modelMatrix;
    uniform mat4 viewMatrix;
    uniform mat4 projMatrix;
    ...
    
    void main() {
    ...
    gl_Position = projMatrix*viewMatrix*modelMatrix*in_vertexPosition;
    ...
    }
    

    如果这不是你想要的,那么请再详细说明一下

    不,每个行星的位置都已计算,这与网格几何体无关。相反,我想画一条拖尾轨道线——即每个行星物体的运动线,一个圆是最简单的例子。但是想象一个圆圈,行星离它越远,每个部分都会逐渐消失(参见我文章中的参考图片)。我们的想法是以某种方式重复使用旧的垂直线,将最后一个垂直线向上移动。啊,好吧,明白了,你想在行星移动后留下线条,对吗?我要做的是,创建一个新的VBO来保存线数据(如果是简单线,则开始和结束,如果是贝塞尔线,则有很多顶点),然后只渲染它们。你的意思是每帧创建一个新的VBO吗?我们已经缩小了我迷失的范围:如何更新VBO?现在我看到的问题是,地球正在越过一条铁路,前面的轨道是“不更新的”,后面的轨道是什么。所以我的想法就是你在上面看到的,将最后一个顶点向上移动,然后以某种方式重新链接-这是不是太复杂了。。。这可能意味着每次更新都要更改索引缓冲区,并说“这就是现在链接点的方式”。继我之前的评论之后:另一种方法是只使用一个椭圆点,这消除了内存中只有可见点的优化,但仍然-如何在VBO中更新特定索引?我是否以某种方式标记每个顶点。。我不是VBO方面的专家,我的大脑仍然倾向于用CPU代码来思考。好吧,如果这是你想要扩展的想法,你正在考虑性能,你想要删除不可见的对象,那么你想使用批处理,因为这是绘制小精灵最简单但最有效的方法,因此,您将在CPU中更新点阵列,然后使用glSubBufferData(…)或更有效的方法将它们发送到GPU,然后可能使用几何体着色器读取要渲染的点和输出线。现在,如果您感兴趣,可以联系我给出批处理的代码示例(对不起,没有github帐户)。您的优化过度了。传递十几个顶点来组成一条“跟踪轨道线”在总体方案中是一个微不足道的数据量,因此在每一帧将整个缓冲区从CPU传递到GPU不会降低渲染速度(假设渲染的是10或100个行星,而不是数百万个行星)。是的,你也许可以用这种方式实现一个循环缓冲区,但是增加的复杂性不值得任何性能提升。我同意,我开始预分配一个循环,现在正试图找出如何更新每个位置。。。这证明是相当困难的。。。