2013-06-08 3 views
1

Я создаю свой массив this.kernel: у него есть 48 элементов, и я хочу передать его в свой шейдер фрагмента.Пропустить массив в шейдер

Когда я называю

gl.uniform3fv(gl.getUniformLocation(this.program, "kernel"), 16, this.kernel); 

ядра определяется в моем шейдере:

uniform vec3 kernel[16]; 

Я получаю сообщение об ошибке, что не достаточно аргументов. я уже посмотрел спецификации и т.д., но не найти мою проблему -.-

void glUniform3fv( GLint location, GLsizei count, const GLfloat * value); 

Спасибо за помощь

€: Я обратился this.kernel к float32array, но я до сих пор есть эта ошибка.

€ 2: Ошибка в Chrome: не хватает аргументов

в Firefox: NS_ERROR_XPC_BAD_CONVERT_JS: Не удалось преобразовать JavaScript рассуждение

ответ

3

Ваши this.kernel потребности быть Float32Array длиной 48 (= 3 * 16). Вы не можете использовать массив vec3.

Также подсчет не используется в WebGL. Функция (от WebGL Specification) использование

void uniform3fv(WebGLUniformLocation? location, Float32Array v); 

Пример:

gl.uniform3fv(gl.getUniformLocation(shaderProgram, "colors"), new Float32Array([0,1,2,3,4,5])); 

Смотрите полный пример здесь: http://jsfiddle.net/mortennobel/URvtx/

+0

AH ок. Я изменил свой массив this.kernel на this.kernel = new Float32Array (this.kernel); Длина составляет ровно 48 длин. Просто, чтобы быть ясным, я имел в виду, что ядро ​​в моем шейдере есть vec3 По-прежнему получить ошибку не достаточно аргументов. – Pris0n

+0

Я обновил ответ. Надеюсь, это поможет вам :) – Mortennobel

+0

Спасибо. Я много экспериментировал, но, похоже, я забыл эту вариацию. – Pris0n

Смежные вопросы