我尝试了很多不同的策略来得到可用的噪声函数,但都没有成功。那么,在ATI显卡上如何在GLSL中实现Perlin噪声呢?
这里是我尝试过的方法: 我试着将置换和梯度数据放入一个GL_RGBA 1D纹理中,并调用texture1D函数。然而,对此噪声实现的一次调用会导致12个纹理调用,从而降低帧率。
我试着将置换和梯度数据上传到一个uniform vec4数组中,但编译器不允许我在数组中获取一个元素,除非索引是常量。例如:
我曾尝试将数组直接编程到着色器中,但是我遇到了相同的索引问题。听说NVIDIA显卡实际上允许这种方法,但ATI不允许。
我尝试创建一个函数,根据输入索引返回特定的硬编码数据点,但该函数被调用12次并具有64个if语句,导致链接时间无法忍受。
ATI不支持glsl的“内置”噪声函数,而且我不能预先计算噪声并将其导入为纹理,因为我正在处理分形。这意味着我需要在运行时计算噪声的无限精度。
所以总体问题是...
如何解决?
这里是我尝试过的方法: 我试着将置换和梯度数据放入一个GL_RGBA 1D纹理中,并调用texture1D函数。然而,对此噪声实现的一次调用会导致12个纹理调用,从而降低帧率。
我试着将置换和梯度数据上传到一个uniform vec4数组中,但编译器不允许我在数组中获取一个元素,除非索引是常量。例如:
int i = 10;
vec4 a = noise_data[i];
将会产生编译错误:
错误: 0:43: 当使用临时数组间接索引时不支持。
这意味着我只能像这样检索数据:
vec4 a = noise_data[10];
我曾尝试将数组直接编程到着色器中,但是我遇到了相同的索引问题。听说NVIDIA显卡实际上允许这种方法,但ATI不允许。
我尝试创建一个函数,根据输入索引返回特定的硬编码数据点,但该函数被调用12次并具有64个if语句,导致链接时间无法忍受。
ATI不支持glsl的“内置”噪声函数,而且我不能预先计算噪声并将其导入为纹理,因为我正在处理分形。这意味着我需要在运行时计算噪声的无限精度。
所以总体问题是...
如何解决?