UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

106 lines (90 loc) 3.43 kB
// --------------- POST EFFECT DEFINITION --------------- // /** * @class * @name BrightnessContrastEffect * @classdesc Changes the brightness and contrast of the input render target. * @description Creates new instance of the post effect. * @augments PostEffect * @param {GraphicsDevice} graphicsDevice - The graphics device of the application. * @property {number} brightness Controls the brightness of the render target. Ranges from -1 to 1 (-1 is solid black, 0 no change, 1 solid white). * @property {number} contrast Controls the contrast of the render target. Ranges from -1 to 1 (-1 is solid gray, 0 no change, 1 maximum contrast). */ function BrightnessContrastEffect(graphicsDevice) { pc.PostEffect.call(this, graphicsDevice); // Shader author: tapio / http://tapio.github.com/ var fshader = [ 'uniform sampler2D uColorBuffer;', 'uniform float uBrightness;', 'uniform float uContrast;', '', 'varying vec2 vUv0;', '', 'void main() {', ' gl_FragColor = texture2D( uColorBuffer, vUv0 );', ' gl_FragColor.rgb += uBrightness;', '', ' if (uContrast > 0.0) {', ' gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) / (1.0 - uContrast) + 0.5;', ' } else {', ' gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) * (1.0 + uContrast) + 0.5;', ' }', '}' ].join('\n'); this.shader = pc.ShaderUtils.createShader(graphicsDevice, { uniqueName: 'BrightnessContrastShader', attributes: { aPosition: pc.SEMANTIC_POSITION }, vertexGLSL: pc.PostEffect.quadVertexShader, fragmentGLSL: fshader }); // Uniforms this.brightness = 0; this.contrast = 0; } BrightnessContrastEffect.prototype = Object.create(pc.PostEffect.prototype); BrightnessContrastEffect.prototype.constructor = BrightnessContrastEffect; Object.assign(BrightnessContrastEffect.prototype, { render: function (inputTarget, outputTarget, rect) { var device = this.device; var scope = device.scope; scope.resolve('uBrightness').setValue(this.brightness); scope.resolve('uContrast').setValue(this.contrast); scope.resolve('uColorBuffer').setValue(inputTarget.colorBuffer); this.drawQuad(outputTarget, this.shader, rect); } }); // ----------------- SCRIPT DEFINITION ------------------ // var BrightnessContrast = pc.createScript('brightnessContrast'); BrightnessContrast.attributes.add('brightness', { type: 'number', default: 0, min: -1, max: 1, title: 'Brightness' }); BrightnessContrast.attributes.add('contrast', { type: 'number', default: 0, min: -1, max: 1, title: 'Contrast' }); BrightnessContrast.prototype.initialize = function () { this.effect = new BrightnessContrastEffect(this.app.graphicsDevice); this.effect.brightness = this.brightness; this.effect.contrast = this.contrast; this.on('attr', function (name, value) { this.effect[name] = value; }, this); var queue = this.entity.camera.postEffects; queue.addEffect(this.effect); this.on('state', function (enabled) { if (enabled) { queue.addEffect(this.effect); } else { queue.removeEffect(this.effect); } }); this.on('destroy', function () { queue.removeEffect(this.effect); }); };