GLSL 3D Noise Реализация на видеокартах ATI - PullRequest
4 голосов
/ 28 августа 2010

Я пробовал так много разных стратегий, чтобы получить полезную функцию шума, и ни одна из них не сработала.Итак, как реализовать перлин-шум на видеокарте ATI в GLSL?

Вот методы, которые я попробовал: я попытался поместить данные перестановки и градиента в текстуру 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 ]

2 голосов
/ 13 января 2013

Существует проект на github с функциями шума GLSL. Он имеет как «классические», так и более новые шумовые функции в 2,3 и 4D.

IOS имеет реализованную функцию noise.

2 голосов
/ 03 сентября 2010

Для лучшего распределения случайных значений я предлагаю следующие очень хорошие статьи:

  1. Генератор псевдослучайных чисел в GLSL
  2. Учебное пособие по GLSL шуму от люмина

Повеселись!

1 голос
/ 30 августа 2010

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

Это не идеально, но часто достаточно хорошо.

0 голосов
/ 29 августа 2010

Попробуйте добавить #version 150 в верхнюю часть вашего шейдера.

0 голосов
/ 28 августа 2010

Этот SimpleX шум может делать то, что вы хотите.

...