代码之家  ›  专栏  ›  技术社区  ›  Ned Bingham

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

  •  4
  • Ned Bingham  · 技术社区  · 14 年前

    我已经尝试了很多不同的策略来获得一个有用的噪声函数,但没有一个有效。那么,如何在GLSL中的ATI图形卡上实现柏林噪声呢?

    以下是我尝试的方法: 我尝试将排列和渐变数据放入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 回复  |  直到 12 年前
        1
  •  1
  •   Calvin1602    14 年前

    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

    它并不完美,但往往足够好。

        2
  •  2
  •   Agnius Vasiliauskas    14 年前

    为了更好地分布随机值,我建议使用以下非常好的文章:

    1. Pseudo Random Number Generator in GLSL
    2. Lumina noise GLSL tutorial

    尽情享受吧!!!!

        3
  •  2
  •   bobobobo    12 年前

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

    国际标准化组织 noise 实现的功能。

        4
  •  0
  •   genpfault    14 年前

    这个 SimpleX 噪音可能会满足你的需要。

        5
  •  -1
  •   The Fiddler    14 年前

    尝试将版本150添加到材质球的顶部。