FXAA3.hlsl 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721
  1. //----------------------------------------------------------------------------------
  2. //
  3. // Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions
  7. // are met:
  8. // * Redistributions of source code must retain the above copyright
  9. // notice, this list of conditions and the following disclaimer.
  10. // * Redistributions in binary form must reproduce the above copyright
  11. // notice, this list of conditions and the following disclaimer in the
  12. // documentation and/or other materials provided with the distribution.
  13. // * Neither the name of NVIDIA CORPORATION nor the names of its
  14. // contributors may be used to endorse or promote products derived
  15. // from this software without specific prior written permission.
  16. //
  17. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
  18. // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  20. // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  21. // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  22. // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  23. // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  24. // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  25. // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  27. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. //
  29. //----------------------------------------------------------------------------------
  30. /*============================================================================
  31. NVIDIA FXAA 3.11 by TIMOTHY LOTTES
  32. ------------------------------------------------------------------------------
  33. Modified for Urho3D
  34. ============================================================================*/
  35. /*==========================================================================*/
  36. //
  37. // Urho3D specific preparations
  38. //
  39. /*--------------------------------------------------------------------------*/
  40. #include "Uniforms.hlsl"
  41. #include "Samplers.hlsl"
  42. #include "Transform.hlsl"
  43. #include "ScreenPos.hlsl"
  44. #ifdef COMPILEPS
  45. /*============================================================================
  46. FXAA QUALITY - TUNING KNOBS
  47. ------------------------------------------------------------------------------
  48. NOTE the other tuning knobs are now in the shader function inputs!
  49. ============================================================================*/
  50. #ifndef FXAA_QUALITY_PRESET
  51. //
  52. // Choose the quality preset.
  53. // This needs to be compiled into the shader as it effects code.
  54. // Best option to include multiple presets is to
  55. // in each shader define the preset, then include this file.
  56. //
  57. // OPTIONS
  58. // -----------------------------------------------------------------------
  59. // 10 to 15 - default medium dither (10=fastest, 15=highest quality)
  60. // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)
  61. // 39 - no dither, very expensive
  62. //
  63. // NOTES
  64. // -----------------------------------------------------------------------
  65. // 12 = slightly faster then FXAA 3.9 and higher edge quality (default)
  66. // 13 = about same speed as FXAA 3.9 and better than 12
  67. // 23 = closest to FXAA 3.9 visually and performance wise
  68. // _ = the lowest digit is directly related to performance
  69. // _ = the highest digit is directly related to style
  70. //
  71. #define FXAA_QUALITY_PRESET 12
  72. #endif
  73. /*============================================================================
  74. FXAA QUALITY - PRESETS
  75. ============================================================================*/
  76. /*============================================================================
  77. FXAA QUALITY - MEDIUM DITHER PRESETS
  78. ============================================================================*/
  79. #if (FXAA_QUALITY_PRESET == 10)
  80. #define FXAA_QUALITY_PS 3
  81. #define FXAA_QUALITY_P0 1.5
  82. #define FXAA_QUALITY_P1 3.0
  83. #define FXAA_QUALITY_P2 12.0
  84. #endif
  85. /*--------------------------------------------------------------------------*/
  86. #if (FXAA_QUALITY_PRESET == 11)
  87. #define FXAA_QUALITY_PS 4
  88. #define FXAA_QUALITY_P0 1.0
  89. #define FXAA_QUALITY_P1 1.5
  90. #define FXAA_QUALITY_P2 3.0
  91. #define FXAA_QUALITY_P3 12.0
  92. #endif
  93. /*--------------------------------------------------------------------------*/
  94. #if (FXAA_QUALITY_PRESET == 12)
  95. #define FXAA_QUALITY_PS 5
  96. #define FXAA_QUALITY_P0 1.0
  97. #define FXAA_QUALITY_P1 1.5
  98. #define FXAA_QUALITY_P2 2.0
  99. #define FXAA_QUALITY_P3 4.0
  100. #define FXAA_QUALITY_P4 12.0
  101. #endif
  102. /*--------------------------------------------------------------------------*/
  103. #if (FXAA_QUALITY_PRESET == 13)
  104. #define FXAA_QUALITY_PS 6
  105. #define FXAA_QUALITY_P0 1.0
  106. #define FXAA_QUALITY_P1 1.5
  107. #define FXAA_QUALITY_P2 2.0
  108. #define FXAA_QUALITY_P3 2.0
  109. #define FXAA_QUALITY_P4 4.0
  110. #define FXAA_QUALITY_P5 12.0
  111. #endif
  112. /*--------------------------------------------------------------------------*/
  113. #if (FXAA_QUALITY_PRESET == 14)
  114. #define FXAA_QUALITY_PS 7
  115. #define FXAA_QUALITY_P0 1.0
  116. #define FXAA_QUALITY_P1 1.5
  117. #define FXAA_QUALITY_P2 2.0
  118. #define FXAA_QUALITY_P3 2.0
  119. #define FXAA_QUALITY_P4 2.0
  120. #define FXAA_QUALITY_P5 4.0
  121. #define FXAA_QUALITY_P6 12.0
  122. #endif
  123. /*--------------------------------------------------------------------------*/
  124. #if (FXAA_QUALITY_PRESET == 15)
  125. #define FXAA_QUALITY_PS 8
  126. #define FXAA_QUALITY_P0 1.0
  127. #define FXAA_QUALITY_P1 1.5
  128. #define FXAA_QUALITY_P2 2.0
  129. #define FXAA_QUALITY_P3 2.0
  130. #define FXAA_QUALITY_P4 2.0
  131. #define FXAA_QUALITY_P5 2.0
  132. #define FXAA_QUALITY_P6 4.0
  133. #define FXAA_QUALITY_P7 12.0
  134. #endif
  135. /*============================================================================
  136. FXAA QUALITY - LOW DITHER PRESETS
  137. ============================================================================*/
  138. #if (FXAA_QUALITY_PRESET == 20)
  139. #define FXAA_QUALITY_PS 3
  140. #define FXAA_QUALITY_P0 1.5
  141. #define FXAA_QUALITY_P1 2.0
  142. #define FXAA_QUALITY_P2 8.0
  143. #endif
  144. /*--------------------------------------------------------------------------*/
  145. #if (FXAA_QUALITY_PRESET == 21)
  146. #define FXAA_QUALITY_PS 4
  147. #define FXAA_QUALITY_P0 1.0
  148. #define FXAA_QUALITY_P1 1.5
  149. #define FXAA_QUALITY_P2 2.0
  150. #define FXAA_QUALITY_P3 8.0
  151. #endif
  152. /*--------------------------------------------------------------------------*/
  153. #if (FXAA_QUALITY_PRESET == 22)
  154. #define FXAA_QUALITY_PS 5
  155. #define FXAA_QUALITY_P0 1.0
  156. #define FXAA_QUALITY_P1 1.5
  157. #define FXAA_QUALITY_P2 2.0
  158. #define FXAA_QUALITY_P3 2.0
  159. #define FXAA_QUALITY_P4 8.0
  160. #endif
  161. /*--------------------------------------------------------------------------*/
  162. #if (FXAA_QUALITY_PRESET == 23)
  163. #define FXAA_QUALITY_PS 6
  164. #define FXAA_QUALITY_P0 1.0
  165. #define FXAA_QUALITY_P1 1.5
  166. #define FXAA_QUALITY_P2 2.0
  167. #define FXAA_QUALITY_P3 2.0
  168. #define FXAA_QUALITY_P4 2.0
  169. #define FXAA_QUALITY_P5 8.0
  170. #endif
  171. /*--------------------------------------------------------------------------*/
  172. #if (FXAA_QUALITY_PRESET == 24)
  173. #define FXAA_QUALITY_PS 7
  174. #define FXAA_QUALITY_P0 1.0
  175. #define FXAA_QUALITY_P1 1.5
  176. #define FXAA_QUALITY_P2 2.0
  177. #define FXAA_QUALITY_P3 2.0
  178. #define FXAA_QUALITY_P4 2.0
  179. #define FXAA_QUALITY_P5 3.0
  180. #define FXAA_QUALITY_P6 8.0
  181. #endif
  182. /*--------------------------------------------------------------------------*/
  183. #if (FXAA_QUALITY_PRESET == 25)
  184. #define FXAA_QUALITY_PS 8
  185. #define FXAA_QUALITY_P0 1.0
  186. #define FXAA_QUALITY_P1 1.5
  187. #define FXAA_QUALITY_P2 2.0
  188. #define FXAA_QUALITY_P3 2.0
  189. #define FXAA_QUALITY_P4 2.0
  190. #define FXAA_QUALITY_P5 2.0
  191. #define FXAA_QUALITY_P6 4.0
  192. #define FXAA_QUALITY_P7 8.0
  193. #endif
  194. /*--------------------------------------------------------------------------*/
  195. #if (FXAA_QUALITY_PRESET == 26)
  196. #define FXAA_QUALITY_PS 9
  197. #define FXAA_QUALITY_P0 1.0
  198. #define FXAA_QUALITY_P1 1.5
  199. #define FXAA_QUALITY_P2 2.0
  200. #define FXAA_QUALITY_P3 2.0
  201. #define FXAA_QUALITY_P4 2.0
  202. #define FXAA_QUALITY_P5 2.0
  203. #define FXAA_QUALITY_P6 2.0
  204. #define FXAA_QUALITY_P7 4.0
  205. #define FXAA_QUALITY_P8 8.0
  206. #endif
  207. /*--------------------------------------------------------------------------*/
  208. #if (FXAA_QUALITY_PRESET == 27)
  209. #define FXAA_QUALITY_PS 10
  210. #define FXAA_QUALITY_P0 1.0
  211. #define FXAA_QUALITY_P1 1.5
  212. #define FXAA_QUALITY_P2 2.0
  213. #define FXAA_QUALITY_P3 2.0
  214. #define FXAA_QUALITY_P4 2.0
  215. #define FXAA_QUALITY_P5 2.0
  216. #define FXAA_QUALITY_P6 2.0
  217. #define FXAA_QUALITY_P7 2.0
  218. #define FXAA_QUALITY_P8 4.0
  219. #define FXAA_QUALITY_P9 8.0
  220. #endif
  221. /*--------------------------------------------------------------------------*/
  222. #if (FXAA_QUALITY_PRESET == 28)
  223. #define FXAA_QUALITY_PS 11
  224. #define FXAA_QUALITY_P0 1.0
  225. #define FXAA_QUALITY_P1 1.5
  226. #define FXAA_QUALITY_P2 2.0
  227. #define FXAA_QUALITY_P3 2.0
  228. #define FXAA_QUALITY_P4 2.0
  229. #define FXAA_QUALITY_P5 2.0
  230. #define FXAA_QUALITY_P6 2.0
  231. #define FXAA_QUALITY_P7 2.0
  232. #define FXAA_QUALITY_P8 2.0
  233. #define FXAA_QUALITY_P9 4.0
  234. #define FXAA_QUALITY_P10 8.0
  235. #endif
  236. /*--------------------------------------------------------------------------*/
  237. #if (FXAA_QUALITY_PRESET == 29)
  238. #define FXAA_QUALITY_PS 12
  239. #define FXAA_QUALITY_P0 1.0
  240. #define FXAA_QUALITY_P1 1.5
  241. #define FXAA_QUALITY_P2 2.0
  242. #define FXAA_QUALITY_P3 2.0
  243. #define FXAA_QUALITY_P4 2.0
  244. #define FXAA_QUALITY_P5 2.0
  245. #define FXAA_QUALITY_P6 2.0
  246. #define FXAA_QUALITY_P7 2.0
  247. #define FXAA_QUALITY_P8 2.0
  248. #define FXAA_QUALITY_P9 2.0
  249. #define FXAA_QUALITY_P10 4.0
  250. #define FXAA_QUALITY_P11 8.0
  251. #endif
  252. /*============================================================================
  253. FXAA QUALITY - EXTREME QUALITY
  254. ============================================================================*/
  255. #if (FXAA_QUALITY_PRESET == 39)
  256. #define FXAA_QUALITY_PS 12
  257. #define FXAA_QUALITY_P0 1.0
  258. #define FXAA_QUALITY_P1 1.0
  259. #define FXAA_QUALITY_P2 1.0
  260. #define FXAA_QUALITY_P3 1.0
  261. #define FXAA_QUALITY_P4 1.0
  262. #define FXAA_QUALITY_P5 1.5
  263. #define FXAA_QUALITY_P6 2.0
  264. #define FXAA_QUALITY_P7 2.0
  265. #define FXAA_QUALITY_P8 2.0
  266. #define FXAA_QUALITY_P9 2.0
  267. #define FXAA_QUALITY_P10 4.0
  268. #define FXAA_QUALITY_P11 8.0
  269. #endif
  270. /*============================================================================
  271. Support Functions
  272. ============================================================================*/
  273. float CalcLuma(float3 rgb)
  274. {
  275. float3 luma = float3(0.299, 0.587, 0.114);
  276. return dot(rgb, luma);
  277. }
  278. /*--------------------------------------------------------------------------*/
  279. #ifndef D3D11
  280. #define FxaaTexTop(tex, p) float4(tex2Dlod(s##tex, float4(p, 0.0, 0.0)).rgb, 1.0)
  281. #define LumaTop(tex, p) CalcLuma(tex2Dlod(s##tex, float4(p, 0.0, 0.0)).rgb)
  282. #define LumaOff(tex, p, o, r) CalcLuma(tex2Dlod(s##tex, float4(p + (o * r), 0, 0)).rgb)
  283. #else
  284. #define FxaaTexTop(tex, p) float4(t##tex.SampleLevel(s##tex, p, 0.0).rgb, 1.0)
  285. #define LumaTop(tex, p) CalcLuma(t##tex.SampleLevel(s##tex, p, 0.0).rgb)
  286. #define LumaOff(tex, p, o, r) CalcLuma(t##tex.SampleLevel(s##tex, p + (o * r), 0.0).rgb)
  287. #endif
  288. /*============================================================================
  289. FXAA3 QUALITY - PC
  290. ============================================================================*/
  291. float4 FxaaPixelShader(
  292. //
  293. // Use noperspective interpolation here (turn off perspective interpolation).
  294. // {xy} = center of pixel
  295. float2 pos,
  296. //
  297. // Input color texture.
  298. // {rgb_} = color in linear or perceptual color space
  299. // if (FXAA_GREEN_AS_LUMA == 0)
  300. // {__a} = luma in perceptual color space (not linear)
  301. //sampler2D tex,
  302. //
  303. // Only used on FXAA Quality.
  304. // This must be from a constant/uniform.
  305. // {x_} = 1.0/screenWidthInPixels
  306. // {_y} = 1.0/screenHeightInPixels
  307. float2 fxaaQualityRcpFrame,
  308. //
  309. // Only used on FXAA Quality.
  310. // This used to be the FXAA_QUALITY_SUBPIX define.
  311. // It is here now to allow easier tuning.
  312. // Choose the amount of sub-pixel aliasing removal.
  313. // This can effect sharpness.
  314. // 1.00 - upper limit (softer)
  315. // 0.75 - default amount of filtering
  316. // 0.50 - lower limit (sharper, less sub-pixel aliasing removal)
  317. // 0.25 - almost off
  318. // 0.00 - completely off
  319. float fxaaQualitySubpix,
  320. //
  321. // Only used on FXAA Quality.
  322. // This used to be the FXAA_QUALITY_EDGE_THRESHOLD define.
  323. // It is here now to allow easier tuning.
  324. // The minimum amount of local contrast required to apply algorithm.
  325. // 0.333 - too little (faster)
  326. // 0.250 - low quality
  327. // 0.166 - default
  328. // 0.125 - high quality
  329. // 0.063 - overkill (slower)
  330. float fxaaQualityEdgeThreshold,
  331. //
  332. // Only used on FXAA Quality.
  333. // This used to be the FXAA_QUALITY_EDGE_THRESHOLD_MIN define.
  334. // It is here now to allow easier tuning.
  335. // Trims the algorithm from processing darks.
  336. // 0.0833 - upper limit (default, the start of visible unfiltered edges)
  337. // 0.0625 - high quality (faster)
  338. // 0.0312 - visible limit (slower)
  339. // Special notes when using FXAA_GREEN_AS_LUMA,
  340. // Likely want to set this to zero.
  341. // As colors that are mostly not-green
  342. // will appear very dark in the green channel!
  343. // Tune by looking at mostly non-green content,
  344. // then start at zero and increase until aliasing is a problem.
  345. float fxaaQualityEdgeThresholdMin
  346. ) {
  347. /*--------------------------------------------------------------------------*/
  348. float2 posM;
  349. posM.x = pos.x;
  350. posM.y = pos.y;
  351. float4 rgbyM = FxaaTexTop(DiffMap, posM);
  352. rgbyM.y = CalcLuma(rgbyM.rgb);
  353. #define lumaM rgbyM.y
  354. float lumaS = LumaOff(DiffMap, posM, float2( 0, 1), fxaaQualityRcpFrame.xy);
  355. float lumaE = LumaOff(DiffMap, posM, float2( 1, 0), fxaaQualityRcpFrame.xy);
  356. float lumaN = LumaOff(DiffMap, posM, float2( 0,-1), fxaaQualityRcpFrame.xy);
  357. float lumaW = LumaOff(DiffMap, posM, float2(-1, 0), fxaaQualityRcpFrame.xy);
  358. /*--------------------------------------------------------------------------*/
  359. float maxSM = max(lumaS, lumaM);
  360. float minSM = min(lumaS, lumaM);
  361. float maxESM = max(lumaE, maxSM);
  362. float minESM = min(lumaE, minSM);
  363. float maxWN = max(lumaN, lumaW);
  364. float minWN = min(lumaN, lumaW);
  365. float rangeMax = max(maxWN, maxESM);
  366. float rangeMin = min(minWN, minESM);
  367. float rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;
  368. float range = rangeMax - rangeMin;
  369. float rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);
  370. bool earlyExit = range < rangeMaxClamped;
  371. /*--------------------------------------------------------------------------*/
  372. if(earlyExit)
  373. return FxaaTexTop(DiffMap, pos);
  374. /*--------------------------------------------------------------------------*/
  375. float lumaNW = LumaOff(DiffMap, posM, float2(-1,-1), fxaaQualityRcpFrame.xy);
  376. float lumaSE = LumaOff(DiffMap, posM, float2( 1, 1), fxaaQualityRcpFrame.xy);
  377. float lumaNE = LumaOff(DiffMap, posM, float2( 1,-1), fxaaQualityRcpFrame.xy);
  378. float lumaSW = LumaOff(DiffMap, posM, float2(-1, 1), fxaaQualityRcpFrame.xy);
  379. /*--------------------------------------------------------------------------*/
  380. float lumaNS = lumaN + lumaS;
  381. float lumaWE = lumaW + lumaE;
  382. float subpixRcpRange = 1.0/range;
  383. float subpixNSWE = lumaNS + lumaWE;
  384. float edgeHorz1 = (-2.0 * lumaM) + lumaNS;
  385. float edgeVert1 = (-2.0 * lumaM) + lumaWE;
  386. /*--------------------------------------------------------------------------*/
  387. float lumaNESE = lumaNE + lumaSE;
  388. float lumaNWNE = lumaNW + lumaNE;
  389. float edgeHorz2 = (-2.0 * lumaE) + lumaNESE;
  390. float edgeVert2 = (-2.0 * lumaN) + lumaNWNE;
  391. /*--------------------------------------------------------------------------*/
  392. float lumaNWSW = lumaNW + lumaSW;
  393. float lumaSWSE = lumaSW + lumaSE;
  394. float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);
  395. float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);
  396. float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;
  397. float edgeVert3 = (-2.0 * lumaS) + lumaSWSE;
  398. float edgeHorz = abs(edgeHorz3) + edgeHorz4;
  399. float edgeVert = abs(edgeVert3) + edgeVert4;
  400. /*--------------------------------------------------------------------------*/
  401. float subpixNWSWNESE = lumaNWSW + lumaNESE;
  402. float lengthSign = fxaaQualityRcpFrame.x;
  403. bool horzSpan = edgeHorz >= edgeVert;
  404. float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;
  405. /*--------------------------------------------------------------------------*/
  406. if(!horzSpan) lumaN = lumaW;
  407. if(!horzSpan) lumaS = lumaE;
  408. if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;
  409. float subpixB = (subpixA * (1.0/12.0)) - lumaM;
  410. /*--------------------------------------------------------------------------*/
  411. float gradientN = lumaN - lumaM;
  412. float gradientS = lumaS - lumaM;
  413. float lumaNN = lumaN + lumaM;
  414. float lumaSS = lumaS + lumaM;
  415. bool pairN = abs(gradientN) >= abs(gradientS);
  416. float gradient = max(abs(gradientN), abs(gradientS));
  417. if(pairN) lengthSign = -lengthSign;
  418. float subpixC = clamp((abs(subpixB) * subpixRcpRange), 0.0, 1.0);
  419. /*--------------------------------------------------------------------------*/
  420. float2 posB;
  421. posB.x = posM.x;
  422. posB.y = posM.y;
  423. float2 offNP;
  424. offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;
  425. offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;
  426. if(!horzSpan) posB.x += lengthSign * 0.5;
  427. if( horzSpan) posB.y += lengthSign * 0.5;
  428. /*--------------------------------------------------------------------------*/
  429. float2 posN;
  430. posN.x = posB.x - offNP.x * FXAA_QUALITY_P0;
  431. posN.y = posB.y - offNP.y * FXAA_QUALITY_P0;
  432. float2 posP;
  433. posP.x = posB.x + offNP.x * FXAA_QUALITY_P0;
  434. posP.y = posB.y + offNP.y * FXAA_QUALITY_P0;
  435. float subpixD = ((-2.0)*subpixC) + 3.0;
  436. float lumaEndN = LumaTop(DiffMap, posN);
  437. float subpixE = subpixC * subpixC;
  438. float lumaEndP = LumaTop(DiffMap, posP);
  439. /*--------------------------------------------------------------------------*/
  440. if(!pairN) lumaNN = lumaSS;
  441. float gradientScaled = gradient * 1.0/4.0;
  442. float lumaMM = lumaM - lumaNN * 0.5;
  443. float subpixF = subpixD * subpixE;
  444. bool lumaMLTZero = lumaMM < 0.0;
  445. /*--------------------------------------------------------------------------*/
  446. lumaEndN -= lumaNN * 0.5;
  447. lumaEndP -= lumaNN * 0.5;
  448. bool doneN = abs(lumaEndN) >= gradientScaled;
  449. bool doneP = abs(lumaEndP) >= gradientScaled;
  450. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1;
  451. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1;
  452. bool doneNP = (!doneN) || (!doneP);
  453. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1;
  454. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1;
  455. /*--------------------------------------------------------------------------*/
  456. if(doneNP) {
  457. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  458. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  459. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  460. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  461. doneN = abs(lumaEndN) >= gradientScaled;
  462. doneP = abs(lumaEndP) >= gradientScaled;
  463. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2;
  464. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2;
  465. doneNP = (!doneN) || (!doneP);
  466. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2;
  467. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2;
  468. /*--------------------------------------------------------------------------*/
  469. #if (FXAA_QUALITY_PS > 3)
  470. if(doneNP) {
  471. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  472. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  473. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  474. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  475. doneN = abs(lumaEndN) >= gradientScaled;
  476. doneP = abs(lumaEndP) >= gradientScaled;
  477. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3;
  478. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3;
  479. doneNP = (!doneN) || (!doneP);
  480. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3;
  481. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3;
  482. /*--------------------------------------------------------------------------*/
  483. #if (FXAA_QUALITY_PS > 4)
  484. if(doneNP) {
  485. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  486. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  487. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  488. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  489. doneN = abs(lumaEndN) >= gradientScaled;
  490. doneP = abs(lumaEndP) >= gradientScaled;
  491. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4;
  492. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4;
  493. doneNP = (!doneN) || (!doneP);
  494. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4;
  495. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4;
  496. /*--------------------------------------------------------------------------*/
  497. #if (FXAA_QUALITY_PS > 5)
  498. if(doneNP) {
  499. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  500. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  501. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  502. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  503. doneN = abs(lumaEndN) >= gradientScaled;
  504. doneP = abs(lumaEndP) >= gradientScaled;
  505. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5;
  506. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5;
  507. doneNP = (!doneN) || (!doneP);
  508. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5;
  509. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5;
  510. /*--------------------------------------------------------------------------*/
  511. #if (FXAA_QUALITY_PS > 6)
  512. if(doneNP) {
  513. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  514. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  515. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  516. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  517. doneN = abs(lumaEndN) >= gradientScaled;
  518. doneP = abs(lumaEndP) >= gradientScaled;
  519. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6;
  520. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6;
  521. doneNP = (!doneN) || (!doneP);
  522. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6;
  523. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6;
  524. /*--------------------------------------------------------------------------*/
  525. #if (FXAA_QUALITY_PS > 7)
  526. if(doneNP) {
  527. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  528. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  529. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  530. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  531. doneN = abs(lumaEndN) >= gradientScaled;
  532. doneP = abs(lumaEndP) >= gradientScaled;
  533. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7;
  534. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7;
  535. doneNP = (!doneN) || (!doneP);
  536. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7;
  537. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7;
  538. /*--------------------------------------------------------------------------*/
  539. #if (FXAA_QUALITY_PS > 8)
  540. if(doneNP) {
  541. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  542. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  543. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  544. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  545. doneN = abs(lumaEndN) >= gradientScaled;
  546. doneP = abs(lumaEndP) >= gradientScaled;
  547. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8;
  548. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8;
  549. doneNP = (!doneN) || (!doneP);
  550. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8;
  551. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8;
  552. /*--------------------------------------------------------------------------*/
  553. #if (FXAA_QUALITY_PS > 9)
  554. if(doneNP) {
  555. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  556. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  557. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  558. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  559. doneN = abs(lumaEndN) >= gradientScaled;
  560. doneP = abs(lumaEndP) >= gradientScaled;
  561. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9;
  562. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9;
  563. doneNP = (!doneN) || (!doneP);
  564. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9;
  565. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9;
  566. /*--------------------------------------------------------------------------*/
  567. #if (FXAA_QUALITY_PS > 10)
  568. if(doneNP) {
  569. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  570. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  571. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  572. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  573. doneN = abs(lumaEndN) >= gradientScaled;
  574. doneP = abs(lumaEndP) >= gradientScaled;
  575. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10;
  576. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10;
  577. doneNP = (!doneN) || (!doneP);
  578. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10;
  579. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10;
  580. /*--------------------------------------------------------------------------*/
  581. #if (FXAA_QUALITY_PS > 11)
  582. if(doneNP) {
  583. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  584. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  585. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  586. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  587. doneN = abs(lumaEndN) >= gradientScaled;
  588. doneP = abs(lumaEndP) >= gradientScaled;
  589. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11;
  590. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11;
  591. doneNP = (!doneN) || (!doneP);
  592. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11;
  593. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11;
  594. /*--------------------------------------------------------------------------*/
  595. #if (FXAA_QUALITY_PS > 12)
  596. if(doneNP) {
  597. if(!doneN) lumaEndN = LumaTop(DiffMap, posN.xy);
  598. if(!doneP) lumaEndP = LumaTop(DiffMap, posP.xy);
  599. if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
  600. if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
  601. doneN = abs(lumaEndN) >= gradientScaled;
  602. doneP = abs(lumaEndP) >= gradientScaled;
  603. if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12;
  604. if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12;
  605. doneNP = (!doneN) || (!doneP);
  606. if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12;
  607. if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12;
  608. /*--------------------------------------------------------------------------*/
  609. }
  610. #endif
  611. /*--------------------------------------------------------------------------*/
  612. }
  613. #endif
  614. /*--------------------------------------------------------------------------*/
  615. }
  616. #endif
  617. /*--------------------------------------------------------------------------*/
  618. }
  619. #endif
  620. /*--------------------------------------------------------------------------*/
  621. }
  622. #endif
  623. /*--------------------------------------------------------------------------*/
  624. }
  625. #endif
  626. /*--------------------------------------------------------------------------*/
  627. }
  628. #endif
  629. /*--------------------------------------------------------------------------*/
  630. }
  631. #endif
  632. /*--------------------------------------------------------------------------*/
  633. }
  634. #endif
  635. /*--------------------------------------------------------------------------*/
  636. }
  637. #endif
  638. /*--------------------------------------------------------------------------*/
  639. }
  640. /*--------------------------------------------------------------------------*/
  641. float dstN = posM.x - posN.x;
  642. float dstP = posP.x - posM.x;
  643. if(!horzSpan) dstN = posM.y - posN.y;
  644. if(!horzSpan) dstP = posP.y - posM.y;
  645. /*--------------------------------------------------------------------------*/
  646. bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;
  647. float spanLength = (dstP + dstN);
  648. bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;
  649. float spanLengthRcp = 1.0/spanLength;
  650. /*--------------------------------------------------------------------------*/
  651. bool directionN = dstN < dstP;
  652. float dst = min(dstN, dstP);
  653. bool goodSpan = directionN ? goodSpanN : goodSpanP;
  654. float subpixG = subpixF * subpixF;
  655. float pixelOffset = (dst * (-spanLengthRcp)) + 0.5;
  656. float subpixH = subpixG * fxaaQualitySubpix;
  657. /*--------------------------------------------------------------------------*/
  658. float pixelOffsetGood = goodSpan ? pixelOffset : 0.0;
  659. float pixelOffsetSubpix = max(pixelOffsetGood, subpixH);
  660. if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;
  661. if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;
  662. return FxaaTexTop(DiffMap, posM);
  663. }
  664. /*==========================================================================*/
  665. #endif
  666. /*============================================================================
  667. Urho3D Vertex- and Pixelshader
  668. ============================================================================*/
  669. void VS(float4 iPos : POSITION,
  670. out float2 oScreenPos : TEXCOORD0,
  671. out float4 oPos : OUTPOSITION)
  672. {
  673. float4x3 modelMatrix = iModelMatrix;
  674. float3 worldPos = GetWorldPos(modelMatrix);
  675. oPos = GetClipPos(worldPos);
  676. oScreenPos = GetScreenPosPreDiv(oPos);
  677. }
  678. void PS(float2 iScreenPos : TEXCOORD0,
  679. out float4 oColor : OUTCOLOR0)
  680. {
  681. float2 rcpFrame = float2(cGBufferInvSize.x, cGBufferInvSize.y);
  682. oColor = FxaaPixelShader(
  683. iScreenPos, // float2 pos,
  684. rcpFrame, // float2 fxaaQualityRcpFrame,
  685. 0.75f, // float fxaaQualitySubpix,
  686. 0.166f, // float fxaaQualityEdgeThreshold,
  687. 0.0833f // float fxaaQualityEdgeThresholdMin
  688. );
  689. }