2014-09-19 30 views
0

我工作的一个太阳能系统模拟器,我试图马上弄清楚怎么办尾随轨道在C++/OpenGL的/ GLSL看上去类似这样:OGL 4 +/GLSL/C++ - 尾随行星轨道

Reference

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

所有行星都来自一个类的实例。我有一个想法如何做到这一点,但不知道它的技术可行性。

请指教(是否改善我的想法或更好的东西)。

概念

  1. 有一个VBO与特定的一组顶点数据,比方说8个vertecies如实施例
  2. 创建IBO描述每个连续点
之间的连锁

这个想法是有一个vertess的“跑步机”,其中第一个与行星一起移动:

IBO : [ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 ] 

--------------- ^使GLSL更新在VBO只有第一元件,这意味着在VBO:

VBO : [ v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 ] 

------ --------- ^当前顶点更新每个rendercall

  • 然后,随着行星& V1从移动一设定距离d V2
  • 设置最后的顶点位置,下一个轨道位置,即向前推进连锁:

    IBO : [ 8 | 1 | 2 | 3 | 4 | 5 | 6 | 7 ] 
    

    --------------- ^当前索引进行更新,这意味着vbo:

    VBO : [ v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 ] 
    

    ----------------------------------------- -------------------------------- ^为每个rendercall更新当前顶点

    这是否使任何意义?我真的很喜欢重复使用vertecies的想法,给他们一辈子(对于褪色),然后..做这个relink?是否有可能在GPU级别操作索引缓冲区?也许我的脑海里只是徘徊到一个愚蠢的小巷子里,也许这里有人有一个更好的主意?

    +0

    您过度优化。传递十几个顶点组成一个“尾随轨道线”是事物的宏观计划中的一小部分数据,因此每帧将整个缓冲区从CPU传递到GPU不会减慢渲染速度(假设你是渲染,10或100行星,而不是数百万)。是的,你可以用这种方式实现一个循环缓冲区,但增加的复杂性不值得任何性能增益。 – Jherico 2014-09-20 05:19:21

    +0

    我同意,我转移到preallocating一个圈子,现在试图找出如何更新每个位置......这证明是相当困难...... – mike 2014-09-23 21:16:41

    回答

    0

    我真的不明白你在用这段代码做什么,但据我了解,当你改变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; 
    ... 
    } 
    

    ,如果这是不是你正在寻找的结果,则可以请specifie一个稍微多一点!

    +0

    不,每个星球的位置已经计算出来,这没有什么与网格几何有关。相反,我想绘制一条尾随轨道线 - 即每个行星物体的运动线,圆圈将是最简单的情况。但想象一个圆圈,每个片段消失后,行星离开它(参见我的文章中的参考图片)。这个想法是以某种方式重用旧的顶点,将最后一个顶点移动到链上。 – mike 2014-09-19 23:27:03

    +0

    啊好吧,有你,你想创建行星背后的行吗? 我会做的是创建一个新的VBO来保存线条数据,(在Bezier线的情况下,在简单的线条很多顶点的情况下开始和结束),并只是渲染它们。 – Mehdi 2014-09-20 18:34:59

    +0

    你的意思是每个帧都创建一个新的VBO吗?我们已经缩小到了我输了的地步:我如何更新VBO?现在我发现问题是这个星球正在越过一条铁路,在那里它的前面的轨道不是'更新',它背后是什么。所以我的想法就是你上面看到的,将最后一个顶点移动到链上并以某种方式重新链接 - 是那些过于复杂的事情? ...它可以意味着改变指数缓冲器,说:“这就是现在如何链接点”每一个更新.. – mike 2014-09-22 15:12:50