我已经尝试了很多不同的策略来获得可用的噪音功能,但它们都不起作用。那么,你如何在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的“内置”噪声函数,我不能预先计算噪声并将其作为纹理导入,因为我正在处理分形。这意味着我需要在运行时计算噪声的无限精度。
所以最重要的问题是......
如何?
答案 0 :(得分:2)
为了更好地分配随机值,我建议这些非常好的文章:
答案 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添加到着色器的顶部。