2014-09-19 54 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