Собственно пишу я тут реализацию шума Перлина на glsl. Сначала переменные указывал в самом шейдере, сейчас передаю через uniform переменные. Так вот, при линковке, если в шейдере объявлена uniform переменная scale, то шейдер не линкуется. Фрагментный шейдер:
#extension GL_EXT_gpu_shader4 : enable
uniform int permTable[256];
uniform vec2 randVect[256];
uniform float scale;
float interpolate(float a, float b, float t) {
return a - (3.0*t*t - 2.0*t*t*t)*(a-b);
}
void main() {
/* Текущие координаты - это текстурные координаты из gl_TexCoord[0].xy
*/
int i;
vec2 point = (gl_TexCoord[0].xy)/scale; //положение точки в координатах сетки
//Координаты углов сетки
ivec2 r[4];
r[0] = ivec2(floor(point));
r[1] = r[0] + ivec2(0, 1);
r[2] = r[0] + ivec2(1, 1);
r[3] = r[0] + ivec2(1, 0);
//индексы для выбора случ. вектора
int indexes[4];
for(i=0; i<4; ++i) indexes[i] = permTable[ (permTable[r[i].x % 256] + r[i].y ) % 256];
//соответствующие им векторы градиента
vec2 g[4];
for(i=0; i<4; ++i) g[i] = randVect[indexes[i]];
//векторы, указывающие на данную точку(тексель)
vec2 p[4];
for(i=0; i<4; ++i) p[i] = point - vec2(r[i]);
//скалярные произведения в углах
float scal[4];
for(i=0; i<4; ++i) scal[i] = dot(g[i], p[i]);
//интерполяция
float alongXTop = interpolate(scal[1], scal[2], fract(point.x));
float alongXBot = interpolate(scal[0], scal[3], fract(point.x));
float alongY = interpolate(alongXBot, alongXTop, fract(point.y));
gl_FragColor = vec4(alongY);
}
[\code]
Километровые логи http://pastebin.com/wE2qgayU