【问题标题】:Using OpenGL to animate instanced objects使用 OpenGL 为实例对象设置动画
【发布时间】:2021-10-27 14:33:35
【问题描述】:

我想了解如何使用 OpenGL 创建大量相似的二维对象,然后分别为每个对象设置动画。

我感觉会使用thisglfwGetTime() 来完成。

这里有人可以帮我指出正确的方向吗?

好的,这是迄今为止尝试过的一般事情:

我们有这个处理翻译的向量,创建了以下代码,我稍微修改了一下,以便根据时间改变位置。

glm::vec2 translations[100];
int index = 0;
float offset = 0.1f;
float time = glfwGetTime(); // newcode
for (int y = -10; y < 10; y += 2)
{
    for (int x = -10; x < 10; x += 2)
    {

        glm::vec2 translation;
        translation.x = (float)x / 10.0f + offset + time; // new adjustment
        translation.y = (float)y / 10.0f + offset + time*time; // new adjustmet
        translations[index++] = translation;
    }
}

稍后,在渲染循环中,

while (!glfwWindowShouldClose(window))
{

    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    shader.use();
    glBindVertexArray(quadVAO);
    glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 100); // 100 triangles of 6 vertices each
    glBindVertexArray(0);

    time = glfwGetTime(); // new adjustment

    glfwSwapBuffers(window);
    glfwPollEvents();
}

是我尝试过的。我想我误解了图形管道的工作方式。正如我之前提到的,我的猜测是我需要使用一些 glm 矩阵来完成这项工作,但我不确定......

【问题讨论】:

  • 我不太确定你想问什么。你的代码有什么问题。你预计会发生什么?实际发生了什么?哪条线路没有按预期工作?我可以想象你认为time = glfwGetTime(); // new adjustment应该有效果,但为什么呢?

标签: c++ animation opengl glfw glm-math


【解决方案1】:

在初始化期间,大体方向是:

  • 分配一个缓冲区来保存您的实例的位置 (glNamedBufferStorage)。
  • 为您的 VAO 设置一个实例化顶点属性,该属性从该缓冲区(glVertexArrayBindingDivisor 和其他)获取数据。
  • 更新您的顶点着色器以将实例的位置(来自实例化属性)应用到在着色器中计算的总变换。

然后,每帧一次(或位置改变时):

  • 计算所有实例的位置(您发布的代码)。
  • 使用glNamedBufferSubData 将这些提交到先前分配的缓冲区。

到目前为止,您展示了计算位置的代码。从这里尝试实现其余部分,如果您对其中的任何特定部分有困难,请提出具体问题。

我发布了一个using instancing with multidraw 的示例,供您参考。请注意,在您的情况下,您不需要 multidraw,只需要实例化部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多