【问题标题】:Are there noise functions in GLSL OpenGL ES 2.0 (iOS)?GLSL OpenGL ES 2.0 (iOS) 中是否有噪声函数?
【发布时间】:2012-05-15 19:26:05
【问题描述】:

或任何对应物? 如何生成便宜的随机数?

【问题讨论】:

标签: opengl-es random glsl noise fragment-shader


【解决方案1】:

定义“便宜”。

随机数在计算机中的工作方式是,它们并不是真正随机的。您从一个数字(种子)开始,对于您想要的每个随机数,您对该数字进行一些花哨的计算以获得另一个看起来随机的数字,然后将该数字用作您的随机数和下一个随机数的种子数字。有关血腥细节,请参阅here

问题是,该过程本质上是顺序的,这对着色器没有好处。

理论上,您可以在片段着色器中编写一个函数,该函数可以从片段位置和可能每帧递增的一些统一 int 中产生一些散列,但这对于片段着色器来说是一项非常多的工作,只是产生看起来像噪音的东西。

在 OpenGL 中产生噪波效果的常规技术是创建噪波纹理并让着色器以各种方式使用它。您可以简单地将纹理作为标准纹理应用到您的表面,或者您可以拉伸它或钳制它的颜色值。对于随时间变化的效果,您可能希望使用 3D 纹理,或者拥有更大的 2D 纹理,并通过统一将随机纹理坐标偏移量传递给每帧的片段着色器阶段。

还可以查看perlin noise,它基本上使用了上述效果的变体。

【讨论】:

    【解决方案2】:

    GLSL ES 没有自带噪音功能,桌面 GLSL 噪音功能几乎从未实现过。

    但是,有一些freeware noise functions available。他们应该相当体面和快速。我自己从未使用过它们,但它们应该可以工作。这是 MIT 许可的代码,如果您担心的话。

    【讨论】:

    • 如果您有兴趣,该代码的作者之一在此处提供了答案:stackoverflow.com/a/9823712/19679 并提供了更多背景知识,包括一些关于移动设备性能的 cmets。
    • iOS 最大的缺点是noise* 函数是在模拟器上实现的,而不是在设备上实现的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多