【发布时间】:2012-05-15 19:26:05
【问题描述】:
或任何对应物? 如何生成便宜的随机数?
【问题讨论】:
-
当被问及桌面 GLSL 时,这个问题的答案有一些很好的选择:Random / noise functions for GLSL
标签: opengl-es random glsl noise fragment-shader
或任何对应物? 如何生成便宜的随机数?
【问题讨论】:
标签: opengl-es random glsl noise fragment-shader
定义“便宜”。
随机数在计算机中的工作方式是,它们并不是真正随机的。您从一个数字(种子)开始,对于您想要的每个随机数,您对该数字进行一些花哨的计算以获得另一个看起来随机的数字,然后将该数字用作您的随机数和下一个随机数的种子数字。有关血腥细节,请参阅here。
问题是,该过程本质上是顺序的,这对着色器没有好处。
理论上,您可以在片段着色器中编写一个函数,该函数可以从片段位置和可能每帧递增的一些统一 int 中产生一些散列,但这对于片段着色器来说是一项非常多的工作,只是产生看起来像噪音的东西。
在 OpenGL 中产生噪波效果的常规技术是创建噪波纹理并让着色器以各种方式使用它。您可以简单地将纹理作为标准纹理应用到您的表面,或者您可以拉伸它或钳制它的颜色值。对于随时间变化的效果,您可能希望使用 3D 纹理,或者拥有更大的 2D 纹理,并通过统一将随机纹理坐标偏移量传递给每帧的片段着色器阶段。
还可以查看perlin noise,它基本上使用了上述效果的变体。
【讨论】:
GLSL ES 没有自带噪音功能,桌面 GLSL 噪音功能几乎从未实现过。
但是,有一些freeware noise functions available。他们应该相当体面和快速。我自己从未使用过它们,但它们应该可以工作。这是 MIT 许可的代码,如果您担心的话。
【讨论】:
noise* 函数是在模拟器上实现的,而不是在设备上实现的。