| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116 | ( function () {	/** * NVIDIA FXAA by Timothy Lottes * http://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html * - WebGL port by @supereggbert * http://www.glge.org/demos/fxaa/ */	const FXAAShader = {		uniforms: {			'tDiffuse': {				value: null			},			'resolution': {				value: new THREE.Vector2( 1 / 1024, 1 / 512 )			}		},		vertexShader:  /* glsl */  `		varying vec2 vUv;		void main() {			vUv = uv;			gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );		}`,		fragmentShader: // FXAA 3.11 implementation by NVIDIA, ported to WebGL by Agost Biro (biro@archilogic.com)		//----------------------------------------------------------------------------------		// File:				es3-kepler\FXAA\assets\shaders/FXAA_DefaultES.frag		// SDK Version: v3.00		// Email:			 gameworks@nvidia.com		// Site:				http://developer.nvidia.com/		//		// Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.		//		// Redistribution and use in source and binary forms, with or without		// modification, are permitted provided that the following conditions		// are met:		//	* Redistributions of source code must retain the above copyright		//		notice, this list of conditions and the following disclaimer.		//	* Redistributions in binary form must reproduce the above copyright		//		notice, this list of conditions and the following disclaimer in the		//		documentation and/or other materials provided with the distribution.		//	* Neither the name of NVIDIA CORPORATION nor the names of its		//		contributors may be used to endorse or promote products derived		//		from this software without specific prior written permission.		//		// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS\'\' AND ANY		// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE		// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR		// PURPOSE ARE DISCLAIMED.	IN NO EVENT SHALL THE COPYRIGHT OWNER OR		// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,		// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,		// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR		// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY		// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT		// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE		// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.		//		//----------------------------------------------------------------------------------  /* glsl */  `		precision highp float;		uniform sampler2D tDiffuse;		uniform vec2 resolution;		varying vec2 vUv;		#define FXAA_PC 1		#define FXAA_GLSL_100 1		#define FXAA_QUALITY_PRESET 12		#define FXAA_GREEN_AS_LUMA 1		/*--------------------------------------------------------------------------*/		#ifndef FXAA_PC_CONSOLE				//				// The console algorithm for PC is included				// for developers targeting really low spec machines.				// Likely better to just run FXAA_PC, and use a really low preset.				//				#define FXAA_PC_CONSOLE 0		#endif		/*--------------------------------------------------------------------------*/		#ifndef FXAA_GLSL_120				#define FXAA_GLSL_120 0		#endif		/*--------------------------------------------------------------------------*/		#ifndef FXAA_GLSL_130				#define FXAA_GLSL_130 0		#endif		/*--------------------------------------------------------------------------*/		#ifndef FXAA_HLSL_3				#define FXAA_HLSL_3 0		#endif		/*--------------------------------------------------------------------------*/		#ifndef FXAA_HLSL_4				#define FXAA_HLSL_4 0		#endif		/*--------------------------------------------------------------------------*/		#ifndef FXAA_HLSL_5				#define FXAA_HLSL_5 0		#endif		/*==========================================================================*/		#ifndef FXAA_GREEN_AS_LUMA				//				// For those using non-linear color,				// and either not able to get luma in alpha, or not wanting to,				// this enables FXAA to run using green as a proxy for luma.				// So with this enabled, no need to pack luma in alpha.				//				// This will turn off AA on anything which lacks some amount of green.				// Pure red and blue or combination of only R and B, will get no AA.				//				// Might want to lower the settings for both,				//		fxaaConsoleEdgeThresholdMin				//		fxaaQualityEdgeThresholdMin				// In order to insure AA does not get turned off on colors				// which contain a minor amount of green.				//				// 1 = On.				// 0 = Off.				//				#define FXAA_GREEN_AS_LUMA 0		#endif		/*--------------------------------------------------------------------------*/		#ifndef FXAA_EARLY_EXIT				//				// Controls algorithm\'s early exit path.				// On PS3 turning this ON adds 2 cycles to the shader.				// On 360 turning this OFF adds 10ths of a millisecond to the shader.				// Turning this off on console will result in a more blurry image.				// So this defaults to on.				//				// 1 = On.				// 0 = Off.				//				#define FXAA_EARLY_EXIT 1		#endif		/*--------------------------------------------------------------------------*/		#ifndef FXAA_DISCARD				//				// Only valid for PC OpenGL currently.				// Probably will not work when FXAA_GREEN_AS_LUMA = 1.				//				// 1 = Use discard on pixels which don\'t need AA.				//		 For APIs which enable concurrent TEX+ROP from same surface.				// 0 = Return unchanged color on pixels which don\'t need AA.				//				#define FXAA_DISCARD 0		#endif		/*--------------------------------------------------------------------------*/		#ifndef FXAA_FAST_PIXEL_OFFSET				//				// Used for GLSL 120 only.				//				// 1 = GL API supports fast pixel offsets				// 0 = do not use fast pixel offsets				//				#ifdef GL_EXT_gpu_shader4						#define FXAA_FAST_PIXEL_OFFSET 1				#endif				#ifdef GL_NV_gpu_shader5						#define FXAA_FAST_PIXEL_OFFSET 1				#endif				#ifdef GL_ARB_gpu_shader5						#define FXAA_FAST_PIXEL_OFFSET 1				#endif				#ifndef FXAA_FAST_PIXEL_OFFSET						#define FXAA_FAST_PIXEL_OFFSET 0				#endif		#endif		/*--------------------------------------------------------------------------*/		#ifndef FXAA_GATHER4_ALPHA				//				// 1 = API supports gather4 on alpha channel.				// 0 = API does not support gather4 on alpha channel.				//				#if (FXAA_HLSL_5 == 1)						#define FXAA_GATHER4_ALPHA 1				#endif				#ifdef GL_ARB_gpu_shader5						#define FXAA_GATHER4_ALPHA 1				#endif				#ifdef GL_NV_gpu_shader5						#define FXAA_GATHER4_ALPHA 1				#endif				#ifndef FXAA_GATHER4_ALPHA						#define FXAA_GATHER4_ALPHA 0				#endif		#endif		/*============================================================================														FXAA QUALITY - TUNING KNOBS		------------------------------------------------------------------------------		NOTE the other tuning knobs are now in the shader function inputs!		============================================================================*/		#ifndef FXAA_QUALITY_PRESET				//				// Choose the quality preset.				// This needs to be compiled into the shader as it effects code.				// Best option to include multiple presets is to				// in each shader define the preset, then include this file.				//				// OPTIONS				// -----------------------------------------------------------------------				// 10 to 15 - default medium dither (10=fastest, 15=highest quality)				// 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)				// 39			 - no dither, very expensive				//				// NOTES				// -----------------------------------------------------------------------				// 12 = slightly faster then FXAA 3.9 and higher edge quality (default)				// 13 = about same speed as FXAA 3.9 and better than 12				// 23 = closest to FXAA 3.9 visually and performance wise				//	_ = the lowest digit is directly related to performance				// _	= the highest digit is directly related to style				//				#define FXAA_QUALITY_PRESET 12		#endif		/*============================================================================															 FXAA QUALITY - PRESETS		============================================================================*/		/*============================================================================												 FXAA QUALITY - MEDIUM DITHER PRESETS		============================================================================*/		#if (FXAA_QUALITY_PRESET == 10)				#define FXAA_QUALITY_PS 3				#define FXAA_QUALITY_P0 1.5				#define FXAA_QUALITY_P1 3.0				#define FXAA_QUALITY_P2 12.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 11)				#define FXAA_QUALITY_PS 4				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 3.0				#define FXAA_QUALITY_P3 12.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 12)				#define FXAA_QUALITY_PS 5				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 4.0				#define FXAA_QUALITY_P4 12.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 13)				#define FXAA_QUALITY_PS 6				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 4.0				#define FXAA_QUALITY_P5 12.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 14)				#define FXAA_QUALITY_PS 7				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 2.0				#define FXAA_QUALITY_P5 4.0				#define FXAA_QUALITY_P6 12.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 15)				#define FXAA_QUALITY_PS 8				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 2.0				#define FXAA_QUALITY_P5 2.0				#define FXAA_QUALITY_P6 4.0				#define FXAA_QUALITY_P7 12.0		#endif		/*============================================================================												 FXAA QUALITY - LOW DITHER PRESETS		============================================================================*/		#if (FXAA_QUALITY_PRESET == 20)				#define FXAA_QUALITY_PS 3				#define FXAA_QUALITY_P0 1.5				#define FXAA_QUALITY_P1 2.0				#define FXAA_QUALITY_P2 8.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 21)				#define FXAA_QUALITY_PS 4				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 8.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 22)				#define FXAA_QUALITY_PS 5				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 8.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 23)				#define FXAA_QUALITY_PS 6				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 2.0				#define FXAA_QUALITY_P5 8.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 24)				#define FXAA_QUALITY_PS 7				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 2.0				#define FXAA_QUALITY_P5 3.0				#define FXAA_QUALITY_P6 8.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 25)				#define FXAA_QUALITY_PS 8				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 2.0				#define FXAA_QUALITY_P5 2.0				#define FXAA_QUALITY_P6 4.0				#define FXAA_QUALITY_P7 8.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 26)				#define FXAA_QUALITY_PS 9				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 2.0				#define FXAA_QUALITY_P5 2.0				#define FXAA_QUALITY_P6 2.0				#define FXAA_QUALITY_P7 4.0				#define FXAA_QUALITY_P8 8.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 27)				#define FXAA_QUALITY_PS 10				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 2.0				#define FXAA_QUALITY_P5 2.0				#define FXAA_QUALITY_P6 2.0				#define FXAA_QUALITY_P7 2.0				#define FXAA_QUALITY_P8 4.0				#define FXAA_QUALITY_P9 8.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 28)				#define FXAA_QUALITY_PS 11				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 2.0				#define FXAA_QUALITY_P5 2.0				#define FXAA_QUALITY_P6 2.0				#define FXAA_QUALITY_P7 2.0				#define FXAA_QUALITY_P8 2.0				#define FXAA_QUALITY_P9 4.0				#define FXAA_QUALITY_P10 8.0		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_QUALITY_PRESET == 29)				#define FXAA_QUALITY_PS 12				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.5				#define FXAA_QUALITY_P2 2.0				#define FXAA_QUALITY_P3 2.0				#define FXAA_QUALITY_P4 2.0				#define FXAA_QUALITY_P5 2.0				#define FXAA_QUALITY_P6 2.0				#define FXAA_QUALITY_P7 2.0				#define FXAA_QUALITY_P8 2.0				#define FXAA_QUALITY_P9 2.0				#define FXAA_QUALITY_P10 4.0				#define FXAA_QUALITY_P11 8.0		#endif		/*============================================================================												 FXAA QUALITY - EXTREME QUALITY		============================================================================*/		#if (FXAA_QUALITY_PRESET == 39)				#define FXAA_QUALITY_PS 12				#define FXAA_QUALITY_P0 1.0				#define FXAA_QUALITY_P1 1.0				#define FXAA_QUALITY_P2 1.0				#define FXAA_QUALITY_P3 1.0				#define FXAA_QUALITY_P4 1.0				#define FXAA_QUALITY_P5 1.5				#define FXAA_QUALITY_P6 2.0				#define FXAA_QUALITY_P7 2.0				#define FXAA_QUALITY_P8 2.0				#define FXAA_QUALITY_P9 2.0				#define FXAA_QUALITY_P10 4.0				#define FXAA_QUALITY_P11 8.0		#endif		/*============================================================================																		API PORTING		============================================================================*/		#if (FXAA_GLSL_100 == 1) || (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1)				#define FxaaBool bool				#define FxaaDiscard discard				#define FxaaFloat float				#define FxaaFloat2 vec2				#define FxaaFloat3 vec3				#define FxaaFloat4 vec4				#define FxaaHalf float				#define FxaaHalf2 vec2				#define FxaaHalf3 vec3				#define FxaaHalf4 vec4				#define FxaaInt2 ivec2				#define FxaaSat(x) clamp(x, 0.0, 1.0)				#define FxaaTex sampler2D		#else				#define FxaaBool bool				#define FxaaDiscard clip(-1)				#define FxaaFloat float				#define FxaaFloat2 float2				#define FxaaFloat3 float3				#define FxaaFloat4 float4				#define FxaaHalf half				#define FxaaHalf2 half2				#define FxaaHalf3 half3				#define FxaaHalf4 half4				#define FxaaSat(x) saturate(x)		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_GLSL_100 == 1)			#define FxaaTexTop(t, p) texture2D(t, p, 0.0)			#define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r), 0.0)		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_GLSL_120 == 1)				// Requires,				//	#version 120				// And at least,				//	#extension GL_EXT_gpu_shader4 : enable				//	(or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)				#define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)				#if (FXAA_FAST_PIXEL_OFFSET == 1)						#define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)				#else						#define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)				#endif				#if (FXAA_GATHER4_ALPHA == 1)						// use #extension GL_ARB_gpu_shader5 : enable						#define FxaaTexAlpha4(t, p) textureGather(t, p, 3)						#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)						#define FxaaTexGreen4(t, p) textureGather(t, p, 1)						#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)				#endif		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_GLSL_130 == 1)				// Requires "#version 130" or better				#define FxaaTexTop(t, p) textureLod(t, p, 0.0)				#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)				#if (FXAA_GATHER4_ALPHA == 1)						// use #extension GL_ARB_gpu_shader5 : enable						#define FxaaTexAlpha4(t, p) textureGather(t, p, 3)						#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)						#define FxaaTexGreen4(t, p) textureGather(t, p, 1)						#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)				#endif		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_HLSL_3 == 1)				#define FxaaInt2 float2				#define FxaaTex sampler2D				#define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))				#define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_HLSL_4 == 1)				#define FxaaInt2 int2				struct FxaaTex { SamplerState smpl; Texture2D tex; };				#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)				#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)		#endif		/*--------------------------------------------------------------------------*/		#if (FXAA_HLSL_5 == 1)				#define FxaaInt2 int2				struct FxaaTex { SamplerState smpl; Texture2D tex; };				#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)				#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)				#define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p)				#define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o)				#define FxaaTexGreen4(t, p) t.tex.GatherGreen(t.smpl, p)				#define FxaaTexOffGreen4(t, p, o) t.tex.GatherGreen(t.smpl, p, o)		#endif		/*============================================================================											 GREEN AS LUMA OPTION SUPPORT FUNCTION		============================================================================*/		#if (FXAA_GREEN_AS_LUMA == 0)				FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.w; }		#else				FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; }		#endif		/*============================================================================																 FXAA3 QUALITY - PC		============================================================================*/		#if (FXAA_PC == 1)		/*--------------------------------------------------------------------------*/		FxaaFloat4 FxaaPixelShader(				//				// Use noperspective interpolation here (turn off perspective interpolation).				// {xy} = center of pixel				FxaaFloat2 pos,				//				// Used only for FXAA Console, and not used on the 360 version.				// Use noperspective interpolation here (turn off perspective interpolation).				// {xy_} = upper left of pixel				// {_zw} = lower right of pixel				FxaaFloat4 fxaaConsolePosPos,				//				// Input color texture.				// {rgb_} = color in linear or perceptual color space				// if (FXAA_GREEN_AS_LUMA == 0)				//		 {__a} = luma in perceptual color space (not linear)				FxaaTex tex,				//				// Only used on the optimized 360 version of FXAA Console.				// For everything but 360, just use the same input here as for "tex".				// For 360, same texture, just alias with a 2nd sampler.				// This sampler needs to have an exponent bias of -1.				FxaaTex fxaaConsole360TexExpBiasNegOne,				//				// Only used on the optimized 360 version of FXAA Console.				// For everything but 360, just use the same input here as for "tex".				// For 360, same texture, just alias with a 3nd sampler.				// This sampler needs to have an exponent bias of -2.				FxaaTex fxaaConsole360TexExpBiasNegTwo,				//				// Only used on FXAA Quality.				// This must be from a constant/uniform.				// {x_} = 1.0/screenWidthInPixels				// {_y} = 1.0/screenHeightInPixels				FxaaFloat2 fxaaQualityRcpFrame,				//				// Only used on FXAA Console.				// This must be from a constant/uniform.				// This effects sub-pixel AA quality and inversely sharpness.				//	 Where N ranges between,				//		 N = 0.50 (default)				//		 N = 0.33 (sharper)				// {x__} = -N/screenWidthInPixels				// {_y_} = -N/screenHeightInPixels				// {_z_} =	N/screenWidthInPixels				// {__w} =	N/screenHeightInPixels				FxaaFloat4 fxaaConsoleRcpFrameOpt,				//				// Only used on FXAA Console.				// Not used on 360, but used on PS3 and PC.				// This must be from a constant/uniform.				// {x__} = -2.0/screenWidthInPixels				// {_y_} = -2.0/screenHeightInPixels				// {_z_} =	2.0/screenWidthInPixels				// {__w} =	2.0/screenHeightInPixels				FxaaFloat4 fxaaConsoleRcpFrameOpt2,				//				// Only used on FXAA Console.				// Only used on 360 in place of fxaaConsoleRcpFrameOpt2.				// This must be from a constant/uniform.				// {x__} =	8.0/screenWidthInPixels				// {_y_} =	8.0/screenHeightInPixels				// {_z_} = -4.0/screenWidthInPixels				// {__w} = -4.0/screenHeightInPixels				FxaaFloat4 fxaaConsole360RcpFrameOpt2,				//				// Only used on FXAA Quality.				// This used to be the FXAA_QUALITY_SUBPIX define.				// It is here now to allow easier tuning.				// Choose the amount of sub-pixel aliasing removal.				// This can effect sharpness.				//	 1.00 - upper limit (softer)				//	 0.75 - default amount of filtering				//	 0.50 - lower limit (sharper, less sub-pixel aliasing removal)				//	 0.25 - almost off				//	 0.00 - completely off				FxaaFloat fxaaQualitySubpix,				//				// Only used on FXAA Quality.				// This used to be the FXAA_QUALITY_EDGE_THRESHOLD define.				// It is here now to allow easier tuning.				// The minimum amount of local contrast required to apply algorithm.				//	 0.333 - too little (faster)				//	 0.250 - low quality				//	 0.166 - default				//	 0.125 - high quality				//	 0.063 - overkill (slower)				FxaaFloat fxaaQualityEdgeThreshold,				//				// Only used on FXAA Quality.				// This used to be the FXAA_QUALITY_EDGE_THRESHOLD_MIN define.				// It is here now to allow easier tuning.				// Trims the algorithm from processing darks.				//	 0.0833 - upper limit (default, the start of visible unfiltered edges)				//	 0.0625 - high quality (faster)				//	 0.0312 - visible limit (slower)				// Special notes when using FXAA_GREEN_AS_LUMA,				//	 Likely want to set this to zero.				//	 As colors that are mostly not-green				//	 will appear very dark in the green channel!				//	 Tune by looking at mostly non-green content,				//	 then start at zero and increase until aliasing is a problem.				FxaaFloat fxaaQualityEdgeThresholdMin,				//				// Only used on FXAA Console.				// This used to be the FXAA_CONSOLE_EDGE_SHARPNESS define.				// It is here now to allow easier tuning.				// This does not effect PS3, as this needs to be compiled in.				//	 Use FXAA_CONSOLE_PS3_EDGE_SHARPNESS for PS3.				//	 Due to the PS3 being ALU bound,				//	 there are only three safe values here: 2 and 4 and 8.				//	 These options use the shaders ability to a free *|/ by 2|4|8.				// For all other platforms can be a non-power of two.				//	 8.0 is sharper (default!!!)				//	 4.0 is softer				//	 2.0 is really soft (good only for vector graphics inputs)				FxaaFloat fxaaConsoleEdgeSharpness,				//				// Only used on FXAA Console.				// This used to be the FXAA_CONSOLE_EDGE_THRESHOLD define.				// It is here now to allow easier tuning.				// This does not effect PS3, as this needs to be compiled in.				//	 Use FXAA_CONSOLE_PS3_EDGE_THRESHOLD for PS3.				//	 Due to the PS3 being ALU bound,				//	 there are only two safe values here: 1/4 and 1/8.				//	 These options use the shaders ability to a free *|/ by 2|4|8.				// The console setting has a different mapping than the quality setting.				// Other platforms can use other values.				//	 0.125 leaves less aliasing, but is softer (default!!!)				//	 0.25 leaves more aliasing, and is sharper				FxaaFloat fxaaConsoleEdgeThreshold,				//				// Only used on FXAA Console.				// This used to be the FXAA_CONSOLE_EDGE_THRESHOLD_MIN define.				// It is here now to allow easier tuning.				// Trims the algorithm from processing darks.				// The console setting has a different mapping than the quality setting.				// This only applies when FXAA_EARLY_EXIT is 1.				// This does not apply to PS3,				// PS3 was simplified to avoid more shader instructions.				//	 0.06 - faster but more aliasing in darks				//	 0.05 - default				//	 0.04 - slower and less aliasing in darks				// Special notes when using FXAA_GREEN_AS_LUMA,				//	 Likely want to set this to zero.				//	 As colors that are mostly not-green				//	 will appear very dark in the green channel!				//	 Tune by looking at mostly non-green content,				//	 then start at zero and increase until aliasing is a problem.				FxaaFloat fxaaConsoleEdgeThresholdMin,				//				// Extra constants for 360 FXAA Console only.				// Use zeros or anything else for other platforms.				// These must be in physical constant registers and NOT immediates.				// Immediates will result in compiler un-optimizing.				// {xyzw} = float4(1.0, -1.0, 0.25, -0.25)				FxaaFloat4 fxaaConsole360ConstDir		) {		/*--------------------------------------------------------------------------*/				FxaaFloat2 posM;				posM.x = pos.x;				posM.y = pos.y;				#if (FXAA_GATHER4_ALPHA == 1)						#if (FXAA_DISCARD == 0)								FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);								#if (FXAA_GREEN_AS_LUMA == 0)										#define lumaM rgbyM.w								#else										#define lumaM rgbyM.y								#endif						#endif						#if (FXAA_GREEN_AS_LUMA == 0)								FxaaFloat4 luma4A = FxaaTexAlpha4(tex, posM);								FxaaFloat4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1));						#else								FxaaFloat4 luma4A = FxaaTexGreen4(tex, posM);								FxaaFloat4 luma4B = FxaaTexOffGreen4(tex, posM, FxaaInt2(-1, -1));						#endif						#if (FXAA_DISCARD == 1)								#define lumaM luma4A.w						#endif						#define lumaE luma4A.z						#define lumaS luma4A.x						#define lumaSE luma4A.y						#define lumaNW luma4B.w						#define lumaN luma4B.z						#define lumaW luma4B.x				#else						FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);						#if (FXAA_GREEN_AS_LUMA == 0)								#define lumaM rgbyM.w						#else								#define lumaM rgbyM.y						#endif						#if (FXAA_GLSL_100 == 1)							FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 0.0, 1.0), fxaaQualityRcpFrame.xy));							FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0, 0.0), fxaaQualityRcpFrame.xy));							FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 0.0,-1.0), fxaaQualityRcpFrame.xy));							FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, 0.0), fxaaQualityRcpFrame.xy));						#else							FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy));							FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy));							FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy));							FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));						#endif				#endif		/*--------------------------------------------------------------------------*/				FxaaFloat maxSM = max(lumaS, lumaM);				FxaaFloat minSM = min(lumaS, lumaM);				FxaaFloat maxESM = max(lumaE, maxSM);				FxaaFloat minESM = min(lumaE, minSM);				FxaaFloat maxWN = max(lumaN, lumaW);				FxaaFloat minWN = min(lumaN, lumaW);				FxaaFloat rangeMax = max(maxWN, maxESM);				FxaaFloat rangeMin = min(minWN, minESM);				FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;				FxaaFloat range = rangeMax - rangeMin;				FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);				FxaaBool earlyExit = range < rangeMaxClamped;		/*--------------------------------------------------------------------------*/				if(earlyExit)						#if (FXAA_DISCARD == 1)								FxaaDiscard;						#else								return rgbyM;						#endif		/*--------------------------------------------------------------------------*/				#if (FXAA_GATHER4_ALPHA == 0)						#if (FXAA_GLSL_100 == 1)							FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0,-1.0), fxaaQualityRcpFrame.xy));							FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0, 1.0), fxaaQualityRcpFrame.xy));							FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0,-1.0), fxaaQualityRcpFrame.xy));							FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, 1.0), fxaaQualityRcpFrame.xy));						#else							FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy));							FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy));							FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy));							FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));						#endif				#else						FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy));						FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));				#endif		/*--------------------------------------------------------------------------*/				FxaaFloat lumaNS = lumaN + lumaS;				FxaaFloat lumaWE = lumaW + lumaE;				FxaaFloat subpixRcpRange = 1.0/range;				FxaaFloat subpixNSWE = lumaNS + lumaWE;				FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;				FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;		/*--------------------------------------------------------------------------*/				FxaaFloat lumaNESE = lumaNE + lumaSE;				FxaaFloat lumaNWNE = lumaNW + lumaNE;				FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;				FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;		/*--------------------------------------------------------------------------*/				FxaaFloat lumaNWSW = lumaNW + lumaSW;				FxaaFloat lumaSWSE = lumaSW + lumaSE;				FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);				FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);				FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;				FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;				FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;				FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;		/*--------------------------------------------------------------------------*/				FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;				FxaaFloat lengthSign = fxaaQualityRcpFrame.x;				FxaaBool horzSpan = edgeHorz >= edgeVert;				FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;		/*--------------------------------------------------------------------------*/				if(!horzSpan) lumaN = lumaW;				if(!horzSpan) lumaS = lumaE;				if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;				FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;		/*--------------------------------------------------------------------------*/				FxaaFloat gradientN = lumaN - lumaM;				FxaaFloat gradientS = lumaS - lumaM;				FxaaFloat lumaNN = lumaN + lumaM;				FxaaFloat lumaSS = lumaS + lumaM;				FxaaBool pairN = abs(gradientN) >= abs(gradientS);				FxaaFloat gradient = max(abs(gradientN), abs(gradientS));				if(pairN) lengthSign = -lengthSign;				FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);		/*--------------------------------------------------------------------------*/				FxaaFloat2 posB;				posB.x = posM.x;				posB.y = posM.y;				FxaaFloat2 offNP;				offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;				offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;				if(!horzSpan) posB.x += lengthSign * 0.5;				if( horzSpan) posB.y += lengthSign * 0.5;		/*--------------------------------------------------------------------------*/				FxaaFloat2 posN;				posN.x = posB.x - offNP.x * FXAA_QUALITY_P0;				posN.y = posB.y - offNP.y * FXAA_QUALITY_P0;				FxaaFloat2 posP;				posP.x = posB.x + offNP.x * FXAA_QUALITY_P0;				posP.y = posB.y + offNP.y * FXAA_QUALITY_P0;				FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;				FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN));				FxaaFloat subpixE = subpixC * subpixC;				FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP));		/*--------------------------------------------------------------------------*/				if(!pairN) lumaNN = lumaSS;				FxaaFloat gradientScaled = gradient * 1.0/4.0;				FxaaFloat lumaMM = lumaM - lumaNN * 0.5;				FxaaFloat subpixF = subpixD * subpixE;				FxaaBool lumaMLTZero = lumaMM < 0.0;		/*--------------------------------------------------------------------------*/				lumaEndN -= lumaNN * 0.5;				lumaEndP -= lumaNN * 0.5;				FxaaBool doneN = abs(lumaEndN) >= gradientScaled;				FxaaBool doneP = abs(lumaEndP) >= gradientScaled;				if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1;				if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1;				FxaaBool doneNP = (!doneN) || (!doneP);				if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1;				if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1;		/*--------------------------------------------------------------------------*/				if(doneNP) {						if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));						if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));						if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;						if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;						doneN = abs(lumaEndN) >= gradientScaled;						doneP = abs(lumaEndP) >= gradientScaled;						if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2;						if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2;						doneNP = (!doneN) || (!doneP);						if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2;						if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2;		/*--------------------------------------------------------------------------*/						#if (FXAA_QUALITY_PS > 3)						if(doneNP) {								if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));								if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));								if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;								if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;								doneN = abs(lumaEndN) >= gradientScaled;								doneP = abs(lumaEndP) >= gradientScaled;								if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3;								if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3;								doneNP = (!doneN) || (!doneP);								if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3;								if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3;		/*--------------------------------------------------------------------------*/								#if (FXAA_QUALITY_PS > 4)								if(doneNP) {										if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));										if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));										if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;										if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;										doneN = abs(lumaEndN) >= gradientScaled;										doneP = abs(lumaEndP) >= gradientScaled;										if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4;										if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4;										doneNP = (!doneN) || (!doneP);										if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4;										if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4;		/*--------------------------------------------------------------------------*/										#if (FXAA_QUALITY_PS > 5)										if(doneNP) {												if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));												if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));												if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;												if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;												doneN = abs(lumaEndN) >= gradientScaled;												doneP = abs(lumaEndP) >= gradientScaled;												if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5;												if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5;												doneNP = (!doneN) || (!doneP);												if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5;												if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5;		/*--------------------------------------------------------------------------*/												#if (FXAA_QUALITY_PS > 6)												if(doneNP) {														if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));														if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));														if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;														if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;														doneN = abs(lumaEndN) >= gradientScaled;														doneP = abs(lumaEndP) >= gradientScaled;														if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6;														if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6;														doneNP = (!doneN) || (!doneP);														if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6;														if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6;		/*--------------------------------------------------------------------------*/														#if (FXAA_QUALITY_PS > 7)														if(doneNP) {																if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));																if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));																if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;																if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;																doneN = abs(lumaEndN) >= gradientScaled;																doneP = abs(lumaEndP) >= gradientScaled;																if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7;																if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7;																doneNP = (!doneN) || (!doneP);																if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7;																if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7;		/*--------------------------------------------------------------------------*/				#if (FXAA_QUALITY_PS > 8)				if(doneNP) {						if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));						if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));						if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;						if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;						doneN = abs(lumaEndN) >= gradientScaled;						doneP = abs(lumaEndP) >= gradientScaled;						if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8;						if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8;						doneNP = (!doneN) || (!doneP);						if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8;						if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8;		/*--------------------------------------------------------------------------*/						#if (FXAA_QUALITY_PS > 9)						if(doneNP) {								if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));								if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));								if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;								if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;								doneN = abs(lumaEndN) >= gradientScaled;								doneP = abs(lumaEndP) >= gradientScaled;								if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9;								if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9;								doneNP = (!doneN) || (!doneP);								if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9;								if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9;		/*--------------------------------------------------------------------------*/								#if (FXAA_QUALITY_PS > 10)								if(doneNP) {										if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));										if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));										if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;										if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;										doneN = abs(lumaEndN) >= gradientScaled;										doneP = abs(lumaEndP) >= gradientScaled;										if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10;										if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10;										doneNP = (!doneN) || (!doneP);										if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10;										if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10;		/*--------------------------------------------------------------------------*/										#if (FXAA_QUALITY_PS > 11)										if(doneNP) {												if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));												if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));												if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;												if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;												doneN = abs(lumaEndN) >= gradientScaled;												doneP = abs(lumaEndP) >= gradientScaled;												if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11;												if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11;												doneNP = (!doneN) || (!doneP);												if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11;												if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11;		/*--------------------------------------------------------------------------*/												#if (FXAA_QUALITY_PS > 12)												if(doneNP) {														if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));														if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));														if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;														if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;														doneN = abs(lumaEndN) >= gradientScaled;														doneP = abs(lumaEndP) >= gradientScaled;														if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12;														if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12;														doneNP = (!doneN) || (!doneP);														if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12;														if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12;		/*--------------------------------------------------------------------------*/												}												#endif		/*--------------------------------------------------------------------------*/										}										#endif		/*--------------------------------------------------------------------------*/								}								#endif		/*--------------------------------------------------------------------------*/						}						#endif		/*--------------------------------------------------------------------------*/				}				#endif		/*--------------------------------------------------------------------------*/														}														#endif		/*--------------------------------------------------------------------------*/												}												#endif		/*--------------------------------------------------------------------------*/										}										#endif		/*--------------------------------------------------------------------------*/								}								#endif		/*--------------------------------------------------------------------------*/						}						#endif		/*--------------------------------------------------------------------------*/				}		/*--------------------------------------------------------------------------*/				FxaaFloat dstN = posM.x - posN.x;				FxaaFloat dstP = posP.x - posM.x;				if(!horzSpan) dstN = posM.y - posN.y;				if(!horzSpan) dstP = posP.y - posM.y;		/*--------------------------------------------------------------------------*/				FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;				FxaaFloat spanLength = (dstP + dstN);				FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;				FxaaFloat spanLengthRcp = 1.0/spanLength;		/*--------------------------------------------------------------------------*/				FxaaBool directionN = dstN < dstP;				FxaaFloat dst = min(dstN, dstP);				FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;				FxaaFloat subpixG = subpixF * subpixF;				FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;				FxaaFloat subpixH = subpixG * fxaaQualitySubpix;		/*--------------------------------------------------------------------------*/				FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;				FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);				if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;				if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;				#if (FXAA_DISCARD == 1)						return FxaaTexTop(tex, posM);				#else						return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);				#endif		}		/*==========================================================================*/		#endif		void main() {			gl_FragColor = FxaaPixelShader(				vUv,				vec4(0.0),				tDiffuse,				tDiffuse,				tDiffuse,				resolution,				vec4(0.0),				vec4(0.0),				vec4(0.0),				0.75,				0.166,				0.0833,				0.0,				0.0,				0.0,				vec4(0.0)			);			// TODO avoid querying texture twice for same texel			gl_FragColor.a = texture2D(tDiffuse, vUv).a;		}`	};	THREE.FXAAShader = FXAAShader;} )();
 |