AnaglyphEffect constructor

AnaglyphEffect(
  1. WebGLRenderer renderer,
  2. Matrix3 colorMatrixLeft,
  3. Matrix3 colorMatrixRight,
  4. dynamic width,
  5. dynamic height,
)

Implementation

AnaglyphEffect(this.renderer, this.colorMatrixLeft, this.colorMatrixRight,
    width, height) {
  colorMatrixLeft = Matrix3().fromArray(Float32Array.fromList([
    0.456100,
    -0.0400822,
    -0.0152161,
    0.500484,
    -0.0378246,
    -0.0205971,
    0.176381,
    -0.0157589,
    -0.00546856
  ]));

  colorMatrixRight = Matrix3().fromArray(Float32Array.fromList([
    -0.0434706,
    0.378476,
    -0.0721527,
    -0.0879388,
    0.73364,
    -0.112961,
    -0.00155529,
    -0.0184503,
    1.2264
  ]));

  _camera = OrthographicCamera(-1, 1, 1, -1, 0, 1);

  _scene = three.Scene();

  _stereo = three.StereoCamera();

  _params = {
    "minFilter": LinearFilter,
    "magFilter": NearestFilter,
    "format": RGBAFormat
  };

  _renderTargetL = WebGLRenderTarget(width, height, _params);
  _renderTargetR = WebGLRenderTarget(width, height, _params);

  _material = ShaderMaterial({
    "uniforms": {
      'mapLeft': {"value": _renderTargetL.texture},
      'mapRight': {"value": _renderTargetR.texture},
      'colorMatrixLeft': {"value": colorMatrixLeft},
      'colorMatrixRight': {"value": colorMatrixRight}
    },
    "vertexShader": [
      'varying vec2 vUv;',
      'void main() {',
      '	vUv = vec2( uv.x, uv.y );',
      '	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',
      '}'
    ].join('\n'),
    "fragmentShader": [
      'uniform sampler2D mapLeft;',
      'uniform sampler2D mapRight;',
      'varying vec2 vUv;',

      'uniform mat3 colorMatrixLeft;',
      'uniform mat3 colorMatrixRight;',

      // These functions implement sRGB linearization and gamma correction

      'float lin( float c ) {',
      '	return c <= 0.04045 ? c * 0.0773993808 :',
      '			pow( c * 0.9478672986 + 0.0521327014, 2.4 );',
      '}',

      'vec4 lin( vec4 c ) {',
      '	return vec4( lin( c.r ), lin( c.g ), lin( c.b ), c.a );',
      '}',

      'float dev( float c ) {',
      '	return c <= 0.0031308 ? c * 12.92',
      '			: pow( c, 0.41666 ) * 1.055 - 0.055;',
      '}',

      'void main() {',

      '	vec2 uv = vUv;',

      '	vec4 colorL = lin( texture2D( mapLeft, uv ) );',
      '	vec4 colorR = lin( texture2D( mapRight, uv ) );',

      '	vec3 color = clamp(',
      '			colorMatrixLeft * colorL.rgb +',
      '			colorMatrixRight * colorR.rgb, 0., 1. );',

      '	gl_FragColor = vec4(',
      '			dev( color.r ), dev( color.g ), dev( color.b ),',
      '			max( colorL.a, colorR.a ) );',

      '}'
    ].join('\n')
  });

  _mesh = Mesh(PlaneGeometry(2, 2), _material);
  _scene.add(_mesh);
}