4

我已经尝试了很多不同的策略来获得可用的噪声函数,但它们都不起作用。那么,如何在 GLSL 中的 ATI 显卡上实现 perlin 噪声?

以下是我尝试过的方法: 我尝试将排列和渐变数据放入 GL_RGBA 1D 纹理并调用 texture1D 函数。然而,一次调用此噪声实现会导致 12 次纹理调用并杀死帧率。

我尝试将排列和梯度数据上传到统一的 vec4 数组中,但编译器不会让我在数组中获取元素,除非索引是常量。例如:

int i = 10;
vec4 a = noise_data[i];

将给出一个编译器错误:

错误:0:43:使用临时数组间接索引时不支持。

这意味着我只能像这样检索数据:

vec4 a = noise_data[10];

我也尝试将数组直接编程到着色器中,但我遇到了同样的索引问题。我听说 NVIDIA 显卡实际上会允许这种方法,但 ATI 不会。

我尝试制作一个根据输入索引返回特定硬编码数据点的函数,但是该函数被调用 12 次并有 64 个 if 语句,使得链接时间难以忍受。

ATI 不支持 glsl 的“内置”噪声函数,我不能只预先计算噪声并将其作为纹理导入,因为我正在处理分形。这意味着我需要在运行时计算噪声的无限精度。

所以最重要的问题是……

如何?

4

5 回答 5

2

为了更好地分布随机值,我建议这些非常好的文章:

  1. GLSL 中的伪随机数生成器
  2. Lumina 噪声 GLSL 教程

有随机的乐趣!

于 2010-09-03T15:46:34.650 回答
2

github上有一个带有GLSL噪声功能的项目。它在 2,3 和 4D 中具有“经典”和更新的噪声功能。

IOS确实实现了这个noise功能。

于 2013-01-12T21:58:39.477 回答
1

noise() 以未实施而闻名...

滚动你拥有:

int c;
int Xn;
srand(int x, int y, int width){// in pixel
    c = x+y*width;
};

int rand(){
    Xn = (a*Xn+c)%m;
    return Xn;
}

对于 a 和 m 值,请参阅维基百科

它并不完美,但通常足够好。

于 2010-08-30T08:36:46.773 回答
0

这个SimpleX噪音的东西可能会做你想做的事。

于 2010-08-28T05:36:37.690 回答
-1

尝试将#version 150 添加到着色器的顶部。

于 2010-08-29T09:52:02.573 回答