ATI图形卡上的GLSL 3D噪声实现

时间:2010-08-28 02:12:22

标签: opengl glsl noise

我已经尝试了很多不同的策略来获得可用的噪音功能,但它们都不起作用。那么,你如何在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的“内置”噪声函数,我不能预先计算噪声并将其作为纹理导入,因为我正在处理分形。这意味着我需要在运行时计算噪声的无限精度。

所以最重要的问题是......

如何?

5 个答案:

答案 0 :(得分:2)

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

  1. Pseudo Random Number Generator in GLSL
  2. Lumina noise GLSL tutorial
  3. 有随意的乐趣!!!

答案 1 :(得分:2)

有一个project on github具有GLSL噪音功能。它具有2,3和4D中的“经典”和更新的噪声功能。

IOS 确实已实施noise功能。

答案 2 :(得分: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值,请参阅wikipedia

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

答案 3 :(得分:0)

这种SimpleX噪音可能会做你想要的。

答案 4 :(得分:-1)

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