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