withArgs(...uniformArguments) {
        // Learn the parameter names.
        if (this._compiledShaderSlot === undefined) {
            let parameterNames = uniformArguments.map(e => e.name);
            this._compiledShaderSlot = new WglMortalValueSlot(
                () => new WglCompiledShader(this.fragmentShaderSourceGenerator(), parameterNames),
                compiledShader => compiledShader.free());
        }

        return new WglConfiguredShader(texture => {
            if (texture.width === 0 || texture.height === 0) {
                return;
            }

            const GL = WebGLRenderingContext;
            let ctx = initializedWglContext();
            let gl = ctx.gl;

            ENSURE_ATTRIBUTES_BOUND_SLOT.ensureInitialized(ctx.lifetimeCounter);

            // Bind frame buffer.
            gl.bindFramebuffer(GL.FRAMEBUFFER, texture.initializedFramebuffer());
            checkGetErrorResult(gl, "framebufferTexture2D", true);
            checkFrameBufferStatusResult(gl, true);

            // Compile and bind shader.
            this._compiledShaderSlot.initializedValue(ctx.lifetimeCounter).useWithArgs(uniformArguments);

            gl.viewport(0, 0, texture.width, texture.height);
            gl.drawElements(GL.TRIANGLES, 6, GL.UNSIGNED_SHORT, 0);
            checkGetErrorResult(gl, "drawElements", true);
            texture.markRendered();
        });
    }
Returns the same shader, but parameterized by the given arguments. Call renderTo on the result to render to a
destination texture.
@param {!WglArg} uniformArguments
@returns {!WglConfiguredShader}