【问题标题】:OpenGL, two objects moving independentlyOpenGL,两个独立移动的物体
【发布时间】:2014-05-04 02:45:01
【问题描述】:

我需要在 OpenGL 中独立移动两个对象。

这是顶点位置数组:

const float vertexPositions[] = {
    0.25f, 0.25f, 0.0f, 1.0f,
    0.25f, -0.25f, 0.0f, 1.0f,
    -0.25f, -0.25f, 0.0f, 1.0f,
    0.75f, 0.45f, 0.0f, 1.0f,
    0.45f, -0.45f, 0.0f, 1.0f,
    -0.65f, -0.95f, 0.0f, 1.0f,
};

这会转到一个缓冲区,然后有以下命令可以绘制这些三角形:

glDrawArrays(GL_TRIANGLES, 0, 3*2);

下面是负责轮换的部分:

#version 330

layout(location = 0) in vec4 position;
uniform float loopDuration;
uniform float time;

void main()
{
    float timeScale = 3.14159f * 2.0f / loopDuration;

    float currTime = mod(time, loopDuration);
    vec4 totalOffset = vec4(
        cos(currTime * timeScale) * 0.5f,
        sin(currTime * timeScale) * 0.5f,
        0.0f,
        0.0f);

    gl_Position = position + totalOffset;
}

不幸的是,它并没有像我预期的那样工作 - 这些三角形不是独立移动,而是像玻璃板上一样连接在一起。我可以做些什么来独立翻译和旋转它们?我如何使用 GPU 而不是 CPU 来做到这一点?

【问题讨论】:

  • 如果你想让他们独立行动,你必须为他们提供独立的数据。最好将矩阵作为制服传递给片段着色器。任何基本的 opengl 3+ 在线教程都将涵盖这一点。
  • @kkuryllo:必须为每个三角形设置统一的值有一个缺点,即发布者将无法再通过一次绘制调用绘制三角形。
  • 您可以使用额外的顶点属性来指定每个三角形(甚至每个顶点)的动画参数。您可以将它们传递给顶点着色器,就像传递位置一样,然后在着色器代码中使用它们,您可以在其中应用动画逻辑来计算gl_Position
  • 谢谢。如何拆分 gl_Position 以使一个三角形(前三个顶点)显示为 offset1,第二个三角形显示为 offset 2?我只看到 gl_Position 指的是所有顶点的位置。

标签: opengl graphics


【解决方案1】:

我认为你正在做 this tutorial. 在这种情况下,我建议你从 vertexPositions 中删除最后 12 个浮点数,这样你就会得到以下结果:

const float vertexPositions[] = {
    0.25f, 0.25f, 0.0f, 1.0f,
    0.25f, -0.25f, 0.0f, 1.0f,
    -0.25f, -0.25f, 0.0f, 1.0f,
};

并将glDrawArrays(GL_TRIANGLES, 0, 3*2); 更改为glDrawArrays(GL_TRIANGLES, 0, 3);。在您的 display() 函数中,在第一次调用 glDrawArrays() 之后粘贴以下内容:

glUniform1f(loopDurationUnf, 2.5f);
glDrawArrays(GL_TRIANGLES, 0, 3);

这应该以两倍的速度绘制相同的三角形。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多