Цвет шейдера фрагмента WebGL не действует - PullRequest
1 голос
/ 19 марта 2019

У меня есть этот кусок кода:

var FSHADER_SOURCE = `
  precision mediump float;
  uniform vec4 u_FragColor;

  void main() {
    gl_FragColor = u_FragColor;
  }`;

Также есть функция для изменения цвета фрагмента шейдера:

var gl = getWebGLContext(canvas);
var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor');

// lines to set rgb
gl.uniform4f(u_FragColor, rgb[0], rgb[1], rgb[2], rgb[3]);

Странно, я вижу, что rgb установлен на что-то вроде [0,1,0,1] но цвет для фрагмента шейдера в любом случае черный.Даже если я изменю код на:

// still black
gl.uniform4f(u_FragColor, 0.0, 1.0, 0.0, 1.0);

Единственный способ изменить цвет - это напрямую изменить каналы rgb без использования u_FragColor.Что мне здесь не хватает?


Также полный код указан на gist , если полезно.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Активный программный ресурс, такой как расположение универсальной переменной, можно получить после того, как программа была связана:

gl.linkProgram(gl.program);
var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor'); 

Но, чтобы установить значение универсальной переменной, программа должна быть установленакак текущая программа.uniform* устанавливает значения в форме, связанной с расположением используемой в данный момент программы.Обратите внимание, что gl.uniform4f не имеет параметров для программы, затронутая программа является текущей программой:

gl.useProgram(gl.program);
gl.uniform4f(u_FragColor, rgb[0], rgb[1], rgb[2], rgb[3]);
1 голос
/ 20 марта 2019

Это работает для меня, если я делаю что-то вроде этого:

var color = new Float32Array([rgb[0], rgb[1], rgb[2], rgb[3]]);

... а затем:

gl.uniform4fv(program.uniforms['u_fragColor'], color);

Итак, я считаю, что проблема здесь заключается только в конвертации внутри uniform4f вместо uniform4fv.

Обратите внимание, что позже вы можете просто установить цветовые компоненты непосредственно на Float32Array, нет необходимости каждый раз выделять новый.

...