我正在研究太阳系模拟器,我现在正在尝试弄清楚如何在C ++ / OpenGL / GLSL中进行尾随轨道看起来像这样:
问题是我没有静态轨道,行星的位置每帧都会更新。
所有行星都来自一个类。我知道如何做到这一点,但不确定它在技术上是否可行。
请告知(这是为了改善我的想法或更好的东西)。
概念:
这个想法是拥有一个顶点的“跑步机”,第一个与地球一起移动:
IBO : [ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 ]
--------------- ^ make glsl只更新vbo中的第一个元素,这意味着在vbo中:
VBO : [ v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 ]
--------------- ^为每个rendercall更新当前顶点
将最后一个顶点位置设置为下一个轨道位置,即在链中向前移动:
IBO : [ 8 | 1 | 2 | 3 | 4 | 5 | 6 | 7 ]
--------------- ^要更新的当前索引,这意味着在vbo中:
VBO : [ v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 ]
----------------------------------------------- -------------------------- ^为每个rendercall更新当前顶点
这有什么意义吗?我真的很喜欢重复使用椎体的想法,给它们一辈子(褪色)然后......做那个重新连接?甚至可以在GPU级别操作索引缓冲区吗?
也许我的思绪只是徘徊在一条愚蠢的巷子里,也许有人在这里有更好的主意?
答案 0 :(得分: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;
...
}
如果这不是你想要的,那么请详细说明一点!