【问题标题】:Metal shader interpolate values in buffer金属着色器在缓冲区中插入值
【发布时间】:2018-10-15 16:15:38
【问题描述】:

我需要将一个缓冲区传递给 Metal 片段着色器,它是一个包含 N 个浮点值的数组。但是,如果绘制纹理的宽度超过 N 个像素,我希望着色器插入值。如果我使用纹理,使用采样器和设置线性过滤很容易,但不清楚是否可以在片段着色器中的任意缓冲区上设置插值。

【问题讨论】:

    标签: ios fragment-shader metal metalkit


    【解决方案1】:

    不,不可能让 Metal 对缓冲区中的值进行插值。 Metal 无法知道缓冲区有关联的“几何”。例如,一个包含 N 个浮点值的数组可以是 N 个水平元素、N 个垂直元素、5 行 N/5 个元素等。插值需要知道哪些元素是给定元素的邻居,这需要几何知识。

    当然,您可以在着色器中自己进行插值。

    您还可以使用MTLBuffer 的-newTextureWithDescriptor:.../makeTexture() 方法从缓冲区创建纹理。然后您可以从该纹理中采样。

    【讨论】:

    • 在每个渲染周期中重复创建纹理与创建一次纹理然后使用缓冲区字节重复修改它的成本是多少?假设数据小于 1K 字节。
    • 可能创建一次纹理会更快,但没有人能够肯定地回答这个问题。它可能因硬件和操作系统版本而异。您可以尝试在您所针对的硬件和操作系统版本的具有合理代表性的子集上测量性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多