【问题标题】:Should every object have its own shader?每个对象都应该有自己的着色器吗?
【发布时间】:2021-10-21 14:42:03
【问题描述】:

假设我有 4 个相同的对象 - (网格或精灵), 它们都(可能)具有相同的着色器/程序,因为它们是相同的。

每个都有自己的位置,并在单独的渲染调用中渲染。

这些对象的位置每隔一段时间就会改变一次,但不是每一帧。

我不知道最快的处理方法是什么:

  1. 每个对象都有自己的着色器,变换存储在着色器中(GPU 端)?我需要每帧重新绑定 4 个着色器。当我想移动某个对象时,我只需绑定正确的着色器并将新的变换矩阵发送给它。

  2. 所有这些对象只有一个着色器/程序绑定?转换存储在一个类中(CPU 端)。每次渲染其中一个对象时,我必须将其转换发送到着色器,因此我每帧发送 4 个矩阵。当我想移动某个对象时,我只需更改它的类中的值,但不需要向 GPU 发送任何内容。

  3. 还有其他更好的解决方案吗?

【问题讨论】:

    标签: opengl rendering


    【解决方案1】:

    选项 2 是您想要处理的方式。绑定新的着色器程序相当昂贵,理想情况下,您希望在移动到下一个着色器之前尽可能多地使用一个着色器进行渲染。

    至于每帧发送 4 个矩阵,我假设其中 3 个矩阵是您的 MVP 矩阵 - 模型、视图、投影。如果您考虑一下,对于单批渲染调用,视图和投影矩阵将是相同的,因此这些应该只在您的渲染函数中设置一次,然后您可以遍历您的网格,并且只更新模型绘制前的矩阵。这样可以限制 OpenGL 状态更改的次数,从而获得更好的性能。

    【讨论】:

    • 是的,我的意思是 4 个对象的 4 个模型矩阵,这意味着在每次绘制调用之前更新一个矩阵
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多