【问题标题】:Moving/rotating shapes in the vertex shader在顶点着色器中移动/旋转形状
【发布时间】:2014-05-28 10:48:28
【问题描述】:

我正在编写一个使用 OpenGL 绘制多个移动/旋转多边形的程序。每个多边形在世界坐标中都有一个位置,而它的顶点用局部坐标表示(相对于多边形位置)。每个多边形也有一个旋转。

我能想到的唯一方法是通过每帧中的平移/旋转计算顶点位置并将它们推送到 GPU 进行绘制,但我想知道这是否可以在顶点着色器中执行。

我以为我可以用局部坐标表示顶点位置,然后为每个顶点添加位置和旋转属性,但后来我想到这不会比在每一帧上推送新的顶点位置更好。

我应该在 CPU 上进行这种计算,还是有办法在顶点着色器中高效地进行?

【问题讨论】:

    标签: opengl 2d shader vertex-shader


    【解决方案1】:

    顶点着色器确实负责转换你的几何体。但是,顶点着色器会针对场景的每个顶点运行。如果您在顶点着色器中进行转换,您将一遍又一遍地执行相同的计算,每次都会产生相同的结果(而不是简单地将模型视图投影矩阵与顶点坐标相乘)。因此,就效率而言,您最好在 CPU 端执行此操作。

    如果模型很小,就像你的情况一样,我不认为会有太大的差异,因为你仍然需要设置应该以某种方式绘制多边形的坐标。在这种情况下,在 CPU 端进行一次计算仍然是最好的,因为它计算一次独立于多边形的顶点数,并且它可能会导致更清晰的代码,因为它更容易看到你的正在做。

    【讨论】:

    • 所以你认为最好的方法是为每一帧中的每个多边形计算一个变换矩阵,变换所有顶点,然后将它们发送到顶点着色器。对吗?
    • 不,只是在 CPU 端对模型视图矩阵进行转换。否则,您将在顶点着色器中多次执行相同的工作。然后顶点着色器可以进行坐标变换,因为它们在逐个顶点的基础上是不同的。
    • 我不得不问,因为我对 OpenGL 还很陌生。可以为每个顶点设置模型、视图和投影矩阵吗?我认为它们在整个场景中都是一样的。
    • 您通过 glTranslate()、glRotate() 或 glScale() 不断修改模型视图矩阵,并通过 glFrustrum() 或 glOrtho() 调用修改投影矩阵(假设您设置了它们所属的矩阵模式到第一)。然后它们在更改之前是相同的,因此将适用于使用该版本的变换矩阵绘制的所有几何图形。
    【解决方案2】:

    这些计算通常仅在 CPU 上完成。因为在 CPU 上执行它们通常是有效的。您最好的方法是将这些旋转矩阵统一发送并在 GPU 上进行乘法运算。一般来说,送制服并不是很昂贵的操作,所以你应该担心这一点。

    【讨论】:

    • 每个多边形有一个旋转矩阵,所以制服似乎不是解决方案。还是你建议我应该发送一个统一的数组之类的?
    • 是的!我没注意到。那么制服不是你的解决方案。
    • @AbhishekBansal 这实际上是不正确的。 Uniforms 可以传入变换矩阵。但实际上您需要为每个多边形设置它们(我假设您正在研究粒子系统?)。但是当你只使用变换矩阵时,你必须做同样的事情。因此,无论哪种方式,您都必须以某种方式将转换数据放入顶点着色器。因此,最简洁的方法应该是在 CPU 端使用转换。
    猜你喜欢
    • 2020-05-16
    • 1970-01-01
    • 2020-06-19
    • 2019-10-24
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多