Implementación de ruido GLSL en 3D ATI Tarjetas de Video
Pregunta
He intentado muchas estrategias diferentes para obtener una función de ruido utilizable y ninguno de ellos trabajo. Entonces, ¿cómo se implementa perlin ruido en una tarjeta gráfica ATI en GLSL?
Estos son los métodos que he intentado: He intentado poner la permutación y datos gradiente en una textura GL_RGBA 1D y llamar a la función texture1D. Sin embargo, una llamada a este ruido de implementación conduce a 12 llamadas textura y mata a la tasa de fotogramas.
He tratado de subir la permutación y datos de gradiente en una matriz uniforme vec4, pero el compilador no me deja consigo un elemento de la matriz a menos que el índice es una constante. Por ejemplo:
int i = 10;
vec4 a = noise_data[i];
dará un error de compilación de esto:
ERROR: doce y cuarenta y tres:. No soportado cuando el uso de matriz de índice indirecto temporal
Significado sólo puedo recuperar los datos de la siguiente manera:
vec4 a = noise_data[10];
También probé la programación de la matriz directamente en el shader, pero tengo el mismo problema índice. Escucho tarjetas gráficas NVIDIA realmente permitirán este método, pero no lo hará ATI.
I intentado hacer una función que devuelve un específico datos codificados duro punto dependiendo del índice de entrada, pero la función, siendo llamado 12 veces y tener 64 si las declaraciones, hizo que el tiempo que une insoportable.
ATI no soporta el "construido en" funciones de ruido para GLSL, y no puedo acaba de calcular previamente el ruido y la importación como una textura, porque yo estoy tratando con fractales. Esto significa que necesitan la precisión infinita de calcular el ruido en tiempo de ejecución.
Así que la pregunta principal es ...
¿Cómo?
Solución
ruido () es bien conocido por no beeing implementado ...
rollo es el propietario:
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;
}
para A y m valores, ver Wikipedia
No es perfecto, pero a menudo lo suficientemente bueno.
Otros consejos
Para una mejor distribución de los valores aleatorios sugiero estos artículos muy buenos:
Diviértete al azar !!!
Hay un proyecto en github con funciones de ruido GLSL. Tiene dos funciones del "clásico" y más recientes de ruido en 2,3, y 4D.
IOS hace ha implementado la función noise
.
Trate de añadir #version 150 a la parte superior de sombreado.