【发布时间】: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 指的是所有顶点的位置。