LINUX.ORG.RU

Шейдер не линкуется с uniform переменными


0

1

Собственно пишу я тут реализацию шума Перлина на 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

Точно сказать не могу, но есть следующие мысли:

Самый вероятный - превышено максимально возможное кол-во униформ переменных

Очеь маловероятный - предел используемой памяти для униформ переменных

Невероятный - деление на дефолтный ноль у «скейл"а ))) И да - дурной тон делить в шейдере - делай умножение (предварительно получив обратное число для скейла для передачив шейдер) - производительность вырастет

Вместо массивов я бы использовал буфера (униформ или текстурный)

rip86oz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.